{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "e0e6868c-fb23-4f91-862e-673c8008f521",
   "metadata": {},
   "source": [
    "## 任务2：ChatGPT/GLM API使用"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5b955c62-1726-4059-9a6a-fbbc701e32d8",
   "metadata": {},
   "source": [
    "### 对话 API"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "2c5c05f9-64f9-4dc0-8754-861c36a4098e",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n",
      "KeyboardInterrupt\n",
      "\n"
     ]
    }
   ],
   "source": [
    "import requests\n",
    "\n",
    "# 代理地址：https://oa.api2d.site\n",
    "url = \"https://openai.api2d.net/v1/chat/completions\"\n",
    "headers = {\n",
    "    'Content-Type': 'application/json',\n",
    "    'Authorization': 'Bearer fk212271-1JDMqa4Qtn4mggsgDqNsF6nVjqfRLw7O'\n",
    "}\n",
    "\n",
    "data = {\n",
    "    \"model\": \"gpt-3.5-turbo\",\n",
    "    \"messages\": [{\"role\": \"user\", \"content\": \"\"\"你好\"\"\"},]\n",
    "}\n",
    "\n",
    "response = requests.post(url, headers=headers, json=data)\n",
    "print(\"Status Code\", response.status_code)\n",
    "print(\"JSON Response \", response.json())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "a816be6c-e1c2-4290-8f67-c39ca3bdafec",
   "metadata": {
    "editable": true,
    "slideshow": {
     "slide_type": ""
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Status Code 200\n",
      "JSON Response  {'choices': [{'finish_reason': 'stop', 'index': 0, 'message': {'content': '这个笑话的笑点在于两个看似不相关的事件被荒谬地联系在一起：小明迟到了，通常这会让他感到烦恼，但他却中了彩票，这是一个通常会让人感到高兴的事情。这种出人意料的转折，结合了日常生活中通常不被看作是积极的事情（迟到）和一个通常是好消息的事件（中彩票），创造了一个意想不到的幽默效果。幽默往往来自于现实中的矛盾和反差，而这个笑话正是利用了这种反差来逗笑人。', 'role': 'assistant'}}], 'created': 1709816312, 'id': '8457157018162467729', 'model': 'glm-3-turbo', 'request_id': '8457157018162467729', 'usage': {'completion_tokens': 101, 'prompt_tokens': 32, 'total_tokens': 133}}\n"
     ]
    }
   ],
   "source": [
    "import time\n",
    "import jwt\n",
    "import requests\n",
    "\n",
    "# 实际KEY，过期时间\n",
    "def generate_token(apikey: str, exp_seconds: int):\n",
    "    try:\n",
    "        id, secret = apikey.split(\".\")\n",
    "    except Exception as e:\n",
    "        raise Exception(\"invalid apikey\", e)\n",
    "\n",
    "    payload = {\n",
    "        \"api_key\": id,\n",
    "        \"exp\": int(round(time.time() * 1000)) + exp_seconds * 1000,\n",
    "        \"timestamp\": int(round(time.time() * 1000)),\n",
    "    }\n",
    "    return jwt.encode(\n",
    "        payload,\n",
    "        secret,\n",
    "        algorithm=\"HS256\",\n",
    "        headers={\"alg\": \"HS256\", \"sign_type\": \"SIGN\"},\n",
    "    )\n",
    "\n",
    "url = \"https://open.bigmodel.cn/api/paas/v4/chat/completions\"\n",
    "headers = {\n",
    "  'Content-Type': 'application/json',\n",
    "  'Authorization': generate_token(\"7bf001734ef2fd7f7a55bf51dadd7cbb.BMAsoKRDFTmTEPwj\", 10000000)\n",
    "}\n",
    "\n",
    "data = {\n",
    "    \"model\": \"glm-3-turbo\",\n",
    "    \"messages\": [\n",
    "        {\"role\": \"user\", \"content\": \"\"\"我今天很不开心，给我讲一个笑话\"\"\"},\n",
    "        {\"role\": \"assistant\", \"content\": \"\"\"今天小明迟到了，但中了彩票\"\"\"},\n",
    "        {\"role\": \"user\", \"content\": \"\"\"这个笑话笑点在哪儿？\"\"\"},\n",
    "    ]\n",
    "}\n",
    "\n",
    "response = requests.post(url, headers=headers, json=data)\n",
    "\n",
    "print(\"Status Code\", response.status_code)\n",
    "print(\"JSON Response \", response.json())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "45573ef2-e020-43f8-b40e-b25ecfd0406d",
   "metadata": {},
   "source": [
    "### Embeeding API"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "257d2f3a-6820-41ea-b9e4-60da0d1f5b94",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Status Code 200\n",
      "JSON Response  {'object': 'list', 'data': [{'object': 'embedding', 'index': 0, 'embedding': [0.006022519, -0.03437495, -0.013480779, -0.028631987, -0.044259474, -0.01611067, -0.041746926, -0.04726901, 0.02542918, -0.017104644, 0.020804437, 0.003668732, 0.012604148, -0.011430706, 0.0034461233, 0.021646556, -0.0022433451, -0.0037481121, 0.0076963995, 0.00091028045, -0.0070510064, 0.018982152, -0.0019965773, -0.023206543, 0.0042381966, 0.023234153, 0.01717367, -0.0066644605, -0.0065091522, -0.0055600447, 0.01688376, 0.008048432, -0.033187702, -0.013791395, -0.037494924, 0.00456607, 0.028466323, 0.01584837, 0.014923422, -0.0011432432, -0.014909617, 0.013881129, -0.00093185104, 0.0046143886, -0.002994003, 0.014619708, -0.0074064904, 0.010554076, -0.02197788, -0.007965601, -0.03799191, 0.012818129, -0.009718861, -0.00078301376, 0.0143159935, -0.007889672, -0.010774959, 0.008296926, 0.039372433, -0.016621461, 0.027734648, 0.011969109, -0.034954768, -0.0067196814, -0.013025207, -0.0027524119, -0.00846949, -0.032690715, 0.0018706047, -0.0033909024, 0.01515811, 0.014426435, 0.018982152, -0.030205779, 0.033325754, -0.023261763, -0.00046851402, -0.0022226374, 0.0052149147, -0.003333956, 0.035396535, -0.021770801, 0.00594659, 0.033408586, 0.028631987, 0.01104416, -0.00022304028, 0.013770687, -0.035921134, 0.010077797, 0.0042968686, -0.0064090644, 0.012942376, 0.017049422, 0.0058430512, 0.017394554, -0.018126229, 0.049726333, 0.00085505965, -0.016897567, 0.029681182, -0.004434921, 0.0001859388, -0.009256387, -0.03362947, 0.0068473797, -0.013370337, -0.0032493991, 0.025153076, 0.015075279, -0.022778582, 0.03920677, 0.016690487, -0.026699258, -0.043762486, -0.012334947, -0.013473876, -0.00841427, -0.012300434, -0.00809675, 0.014868202, 0.032138508, 0.02232301, -0.018112423, 0.014102013, 0.038185187, -0.021080542, 0.026381738, 0.022654334, -0.0020103825, 0.03586591, 0.018029593, 0.020983905, -0.0011699907, -0.019865684, 0.03506521, -0.022571504, 0.01693898, -0.00668862, -0.013570513, 0.003389177, 0.017794903, 0.013915642, -0.010850888, -0.020155594, 0.010850888, -0.024932193, 0.009435855, -0.015075279, -0.024186712, 0.034595832, -0.030426662, 0.016248722, 0.008165777, 0.011423804, -0.00079293625, -0.008131263, 0.027210051, 0.009919037, -0.017118448, -0.012031233, 0.006036324, 0.012542025, -0.030371442, 0.03362947, 0.025360154, 0.042023033, -0.023606893, 0.004245099, -0.00621234, -0.022599114, 0.030205779, 0.015641293, 0.020348866, -0.024449011, 0.016538631, 0.009463465, 0.0065160547, -0.016869955, -5.6245408e-05, -0.017063228, -0.019755242, -0.0062813666, 0.02755518, 0.017035618, -0.022060711, -0.018512774, -0.04939501, 0.0003345604, 0.0026264396, 0.016248722, 0.0015392799, 0.009070017, -0.008704179, -0.5120073, -0.01409511, -0.027320493, 0.005611814, -0.0026419703, -0.004445275, 0.003975898, 0.021439478, -0.0062054377, -0.052763477, -0.0035255032, 0.030647546, 0.0017575746, 0.00253498, -0.01258344, -0.013798298, 0.01987949, -0.040228356, 0.013639539, -0.008220997, -0.021536114, 0.021563724, -0.0042520016, 0.010077797, 0.015834566, -0.0032459479, -0.013108038, -0.005801636, 0.0035082467, 0.026340323, -0.017753487, 0.027983142, 0.016593851, 0.01584837, 0.03420929, -0.027927922, -0.025470596, 0.011237433, 0.007958698, 0.034071237, -0.010933719, -0.024531841, 0.009642933, -0.012638661, 0.011775836, -0.01515811, 0.03975898, -0.028825259, -0.004245099, 0.012307337, 0.014260773, 0.013480779, 0.009325413, -0.01720128, 0.010029478, 0.008110556, 0.039703757, -0.039400045, 0.016676683, 0.020417891, 0.0024918388, 0.020928685, -0.032387, -0.011258141, -0.024214322, 0.006757646, -0.043652046, -0.018057203, 0.009346121, -0.020763023, 0.017104644, 0.019230645, -0.0030871881, 0.023979634, 0.017767293, 0.01860941, 0.024656089, -0.005104473, -0.01104416, 0.02131523, 0.005425444, -0.0022036552, -0.006336587, -0.028631987, 0.011879375, 0.008814621, 0.0018481712, 0.006481542, 0.008483296, 0.014260773, 0.001302003, 0.018761268, 0.016745709, -0.0055703986, -0.012693882, 0.00652986, -0.015061474, 0.016649073, 0.00687499, -0.04403859, -0.0052045607, -0.0006436675, 0.0045936806, 0.012762908, 0.01616589, 0.014115818, -0.028576765, -0.01996232, 0.03426451, -0.03923438, 0.027430935, 0.02709961, -0.015655098, -0.006681717, 0.0053874794, -0.025801921, -0.019313475, 0.0015461826, -0.0043382845, -0.012811227, 0.023096101, 0.0062848176, 0.052017998, 0.0065091522, -0.009097627, -0.0051286323, 0.008455685, 0.009380634, 0.016331553, -0.025346348, 0.02402105, 0.0064056134, 0.023579283, -0.018388528, 0.032193728, 0.0017299643, 0.037715808, 8.01888e-05, 0.018885516, -0.00059405505, -0.01162398, 0.0030164365, 0.005000934, -0.045004956, 0.0060984474, -0.010346998, -0.002835243, -0.0060294215, -0.023096101, -0.010850888, -0.0012916491, -0.010754252, -0.008524711, -0.015945006, -0.030012507, -0.0024935645, -0.012196895, -0.0013753432, -0.029211804, -0.004942262, 0.03293921, -0.021232398, -0.022267789, 0.014371214, -0.0010733544, -0.027320493, -0.015696513, 0.031834792, -0.047655553, -0.006267561, -0.002407282, -0.03222134, -0.0013123569, 0.018471358, -0.014274578, -0.016096864, -0.005553142, -0.020031346, -0.03235939, -0.017187474, 0.016386773, 0.004735184, -0.014771565, 0.033960793, -0.006654107, -0.015309968, 0.0037791738, 0.011589466, -0.036997937, -0.00052804896, -0.0083797565, 0.0475175, -0.015862176, -0.024145296, 0.013584318, -0.017891541, 0.008593737, 0.014536876, 0.008828426, -0.002277858, -0.011416901, -0.012880253, -0.035479367, -0.0257467, 0.023689725, -0.010878499, -0.015668903, -0.01921684, 0.010768057, 0.006457383, 0.009967355, -0.031779572, 0.013874227, 0.0072960486, 0.012383265, 0.009553199, -0.009691251, 0.01252822, 0.0053598695, 0.023869192, -0.012065746, -0.006888795, 0.040476847, -0.0008718847, -0.023662115, 0.015351383, -0.0020103825, 0.042243913, 0.003156214, 0.0001187463, -0.044314694, -0.019092593, 0.0027696684, -0.0047524404, 0.016248722, -0.03304965, 0.007116581, -0.005421993, 0.021798411, 0.016345358, 0.011637785, 0.018029593, 0.011396193, -0.033463806, 0.022502478, 0.02816261, 0.002298566, 0.008193387, -0.014854396, 0.036197238, -0.030840818, -0.014592097, -0.013149454, -0.0030009055, -0.014550682, -0.013839714, 0.012590343, 0.016621461, 0.0004132932, 0.020321256, -0.011458317, 0.00043205963, 0.002396928, 0.013736174, 0.019396307, -0.00599836, 0.046357863, -0.022709556, -0.0061295093, -0.0043866024, 0.0058292462, 0.028714817, 0.019492943, -0.00044564914, 0.009988063, 0.002144983, -0.020680191, 0.010015673, -0.00514934, 0.029018532, -0.0209701, -0.04321028, 0.0063538435, 0.029929675, 0.013232285, -0.032387, -0.001316671, -0.013839714, -0.041360382, 0.020045152, 0.00016350535, 0.009504881, -0.0041829757, -0.020873463, -0.03788147, 0.0041760732, 0.028438713, -0.008738692, -0.036749445, 0.027969336, -0.012265921, 0.016621461, -0.015972618, -0.041719317, 0.008780108, -0.01582076, -0.011196018, -0.0003265793, 0.0028990922, -0.015434215, -0.033270534, -0.01218309, -0.018788878, -0.04677202, -0.016952787, 0.009283997, -0.005691194, -0.020114178, 0.048456255, 0.028135, -0.020100372, -0.0177811, -0.015268552, -0.016221112, 0.053895503, -0.0055945576, -0.017753487, 0.00048016215, -0.00024331667, 0.009739569, -0.032607883, -0.023952024, 0.0060156165, 0.025346348, -0.012148577, -0.0042485506, 0.010050186, -0.01444024, 0.01255583, -0.009235679, -0.015199526, -0.007413393, 0.0033805487, -0.0029042691, -0.007868964, -0.007931088, 0.014108915, 0.016069254, -0.007868964, 0.02611944, 0.020804437, 0.03641812, 0.012514414, -0.025470596, 0.005635973, -0.026367934, -0.013239187, -0.002352061, -0.0067610973, -0.011824154, -0.012038135, 0.01691137, 0.0068439282, 0.013335824, 0.018250475, 0.047130957, 0.009470368, -0.016179696, 0.0064918958, 0.019396307, 0.039123937, 0.0003999194, -0.0068439282, -0.017035618, 0.016676683, -0.0004939673, -0.01783632, -0.0064194184, 0.0031372318, -0.0014374666, -0.023054685, -0.011499733, -0.010705933, -0.028687207, -0.014164136, -0.017767293, -0.00660924, 0.020776827, -0.010153725, -0.024518037, -0.018347112, -0.00107508, -0.0054910188, 0.0045350087, -7.4796146e-05, 0.010975135, 0.0070164935, -0.05008527, -0.011789641, 0.008821524, 0.028079778, -0.0038136868, 0.016690487, 0.033242922, 0.03967615, -0.0127422, -0.0065057008, -0.013708564, -0.024863167, 0.014074402, 0.017449774, 0.018747462, -0.026285103, -0.012866447, 0.025650064, 0.013384142, 0.017643047, 0.0019189229, -0.004586778, -0.0164558, -0.0019706925, 0.04044924, 8.541968e-05, -0.01582076, 0.016234916, -0.004403859, 0.0037550146, -0.016952787, 0.030978872, -0.0064780903, 0.016248722, -0.0061329603, 0.0038378458, -0.011851765, 0.00072908716, -0.02436618, -0.0014771565, -0.01852658, 0.00096722686, 0.021936465, -0.008062237, 0.017643047, -0.0069716265, -0.029377468, 0.011727518, -0.047821216, 0.020763023, 0.035506975, -0.041305162, 0.0018102069, -0.018305697, -0.0057291584, -0.0058361487, 0.032828767, 0.027223855, 0.027375713, 0.021329036, 0.032497443, -0.03492716, -0.024518037, -0.00047369095, 0.0042727096, 0.025387764, -0.014619708, -0.02102532, -0.031116923, 0.010719739, -0.0046489015, 0.016994203, -0.009760277, -0.020763023, 0.012010525, -0.0012381539, 0.017311722, -0.013239187, -0.0066195936, -0.018982152, -0.0033080713, -0.012611051, -0.031917624, -0.01080257, -0.039593317, -0.011554953, 0.032883987, 0.016414383, 0.018029593, 0.001948259, -0.0014573116, 0.0034254154, -0.0018498969, -0.04053207, 0.01921684, -0.03633529, 0.009056211, 0.031365417, 0.022198763, 0.0031389575, -0.020956295, -0.027568987, 0.021398062, -0.0050527034, -0.0061709248, -0.026409348, -0.051217295, 0.0048559792, -0.023813972, -0.007862062, -0.00054142275, -0.043707266, -0.029625962, 0.049118906, 0.00041480316, 0.017725877, 0.0188441, -0.0016773319, -0.0406149, 0.0496435, -0.013625734, 0.022309205, 0.02617466, -0.008434977, -0.0048594307, 0.0015996776, -0.0046178396, 0.037715808, 0.042961784, 0.014895812, -0.0007821509, 0.012086453, 0.015309968, -7.026632e-05, -0.011720615, 0.010947525, -0.02890809, -0.026395544, -0.027306687, 0.009484173, -0.011106284, 0.017767293, 0.014246968, -0.022129737, 0.00607774, -0.004369346, -0.003924128, 0.012307337, 0.011278849, 0.034761496, -0.0031682935, 0.011071771, 0.01582076, -0.015337578, -0.014274578, -0.0756525, -0.008013919, -0.0027834736, 0.018512774, 0.062620394, 0.0149924485, -0.013570513, 0.04069773, -0.023358399, -0.0007135563, -0.026409348, 0.019064981, 0.014136526, 0.021701775, -0.008013919, -0.026768284, -0.013432461, 0.012045038, 0.006253756, -0.018250475, -0.018222865, -0.011720615, -0.0010517838, 0.009097627, -0.011955304, -0.003541034, 0.012735298, -0.006495347, 0.03241461, -0.00043141254, -0.007793036, -0.011879375, -0.028273052, 0.04102906, -0.018719852, -0.010878499, 0.02099771, 0.0028835614, -0.008145069, 0.0026402446, -0.008724887, 0.03978659, 0.00053883425, 0.022309205, -0.004541911, -0.008614445, 0.008911258, 0.003941385, 0.0056152656, -0.013363434, -0.02611944, -0.008504003, 0.008621348, -0.014102013, -0.009511784, 0.020086568, -0.027210051, -0.02752757, -0.0049181026, -0.008904355, 0.017601632, 0.0077861333, -0.010630005, -0.0177811, -0.025995193, -0.003012985, -0.004631645, 0.013991571, 0.020459307, 0.03915155, -0.017850125, 0.0143021885, 0.04069773, 0.00560146, -0.014923422, -0.0027351554, 0.010098505, -0.014177942, -3.9797804e-05, -0.006336587, -0.022240179, -0.016414383, 0.007358172, -0.025815725, 0.012176187, 0.024918387, 0.02324796, 0.020238424, 0.022364425, -0.008476393, -0.0070648114, 0.0065471167, 0.0062503046, 0.012058843, 0.010436731, -0.016966593, 0.015903592, -0.018982152, -0.0049733236, -0.0036721835, -0.018181449, -0.025732893, 0.007447906, -0.00010504895, 0.001528926, -0.036114406, -0.059528027, -0.016331553, 0.0011277123, 0.008490198, -0.0031769217, 0.00809675, 0.047710773, 0.03788147, 0.016759513, -4.0444924e-05, -0.01717367, -0.020956295, 0.008642056, -0.012445388, -0.04757272, -0.030122949, -0.01688376, 0.038019523, -0.019492943, -0.024297154, -0.01475776, 0.022033101, -0.010181336, 0.019272061, 0.014978643, 0.019603385, 0.018857904, -0.005553142, 0.007044104, 0.019561969, -0.002338256, 0.006447029, -0.009725764, -0.00318555, -0.0072615356, -0.014812981, -0.0004887904, 0.020362671, -0.030012507, -0.015696513, 0.017877735, 0.02102532, 0.011989817, 0.026105635, -0.0090216985, -0.031669132, -0.02266814, -0.018402332, -0.008586835, -0.008787011, 0.02378636, -0.022240179, -0.028065974, -0.015199526, -0.009484173, 0.0061088013, 0.0053874794, -0.010747349, 0.001987949, 0.011168407, -0.023924412, 0.003466831, 0.008407367, -0.0028524997, 0.029184194, 0.0019120203, -0.0066748145, 0.039620925, -0.029846843, -0.04050446, -0.010478147, 0.0035341315, 0.007758523, -0.021177178, -0.0014555858, -0.020887269, 0.017435968, 0.014730149, 0.003052675, 0.008504003, 0.00066955225, -0.0024728565, 0.04108428, -0.02402105, 0.03368469, -0.013729272, -0.03089604, -0.014205552, 0.0123280445, -0.012604148, 0.011596369, -0.020045152, -0.00027826108, -0.00057032733, -0.026091829, -0.006357295, -0.01409511, -0.022585308, 0.007703302, -0.009477271, 0.02431096, 0.002396928, 0.28206787, -0.008987186, -0.009988063, 0.02019701, 0.034733884, 0.02378636, 0.021384256, 0.0011674023, -0.0036031574, -0.019437723, 0.006277915, 0.032580275, 0.00035958234, -0.0041657193, 0.0058188923, -0.033436198, -0.028990922, -0.014454045, -0.0068335743, -0.0096774455, 0.005459957, -0.008648958, -0.025442986, -0.00958081, -0.01613828, -0.015806954, -0.030564714, -0.0036204138, 0.0042381966, -0.0028473227, -0.024987413, 0.002312371, -0.01746358, -0.0063952594, -0.012045038, -0.024945999, 0.009325413, 0.014730149, 0.02433857, 0.056131948, 0.013411753, 0.010374608, -0.010105407, 0.036169626, -0.023178931, -0.02649218, -0.023606893, 0.007199412, 0.005587655, 0.02195027, -0.021094346, -0.015337578, 0.009000991, 0.03164152, -0.0041726218, -0.0110096475, 0.015599877, -0.012976889, -0.018706048, -0.008158874, -0.027679428, 0.02304088, 0.038875446, 0.024449011, -0.04743467, -0.027361909, -0.016745709, -0.01783632, -0.005332259, 0.001089748, -0.0016643895, 0.0031130728, 0.013101135, -0.020680191, -0.037356872, -0.042961784, 0.020555943, 0.021536114, 0.019700022, 0.04953306, -0.005208012, -0.0073305615, 0.01783632, 0.016745709, -0.0029456848, -0.028687207, 0.016069254, -0.0062295967, -0.03296682, 0.011817252, -0.009401342, -0.016731903, -0.00846949, -0.032387, -0.012783616, 0.027679428, 0.011451414, 0.035203263, -0.022005491, 0.0005237348, -0.020749217, 0.010098505, -0.0069371136, -0.015889786, -0.025539622, -0.004148463, 0.0047075734, -0.0064849933, -0.0028628535, -0.016704293, 0.0053874794, -0.03909633, -0.005094119, 0.006233048, 0.030592324, -0.003827492, -0.010678323, -0.0048318203, 0.013439363, -0.013618831, 0.050416593, -0.041001447, 0.007668789, 0.0034789105, -0.005981103, -0.024435205, -0.009511784, -0.008835329, 0.011906986, -0.053177632, -0.008062237, -0.03581069, 0.004286515, -0.010809472, -0.0072477306, 0.048318204, 0.017656852, -0.014716344, 0.010229654, -0.009339218, -0.00076920853, 0.027458545, 0.018775074, -0.0050837654, 0.039482873, -0.02163275, 0.018498968, -0.0103262905, 0.008048432, -0.006988883, -0.019810462, -0.021094346, 0.01860941, -0.014605902, 0.03498238, 0.007323659, -0.031034091, -0.020652581, -0.004255453, 0.03561742, -0.019713826, 0.0038827127, 0.038019523, -0.016234916, -0.017753487, -0.018692242, -0.17262024, 0.008082945, 0.030647546, -0.021232398, 0.028825259, 0.003668732, 0.0035928036, 0.010498855, -0.019147813, 0.003872359, 0.032607883, -0.0011337522, -0.037632976, 0.00073167565, 0.018733658, 0.023648309, -0.03517565, 0.0061743762, 0.0034737336, -0.008283121, 0.052514985, 0.014536876, -0.029432688, 0.008048432, 0.012818129, 0.015337578, -0.0006833574, 0.025332544, -0.0052045607, -0.034871936, -0.0035479367, -0.01892693, 0.015337578, 0.015544656, 0.0392896, 0.02505644, -0.0070095905, -0.0050837654, -0.0039586416, 0.026671648, -0.009187361, 0.0123556545, 0.021411866, 0.015116695, -0.00067300355, 0.03992464, -0.012542025, -0.0072132177, 0.023813972, 0.009366829, 0.0068922467, 0.00499058, 0.0018309148, -0.0026091828, 0.02059736, 0.014129623, 0.011644687, 0.020003736, 0.0076756915, -0.015724124, -0.025884751, -0.028631987, -0.010305583, 0.006495347, -0.013280603, -0.04423186, -0.010153725, 0.021411866, -0.040863395, -0.0049181026, -0.01475776, -0.020735411, 0.02062497, -0.01133407, 0.018360917, 0.0069164056, 0.009366829, 0.008704179, 0.0071648993, 0.0040414724, -0.010885401, 0.032110896, -0.02102532, 0.008711082, 0.024559453, -0.0049388106, -0.0049181026, -0.027568987, -0.0026505985, 0.0037446606, -0.008386659, -0.017077034, -0.00873179, -0.014219357, 0.0042485506, 0.0150200585, 0.005094119, -0.0037274042, -0.012728395, -0.019520555, -0.015171915, -0.034126457, -0.020155594, -0.0021311778, 0.015268552, 0.010692128, 0.032000456, 0.038599342, 0.024559453, -0.008787011, -0.014219357, 0.027417129, 0.031807184, 0.047600333, 0.0051838527, -0.0028542252, -0.0057326094, -0.031227365, 0.012169285, 0.018788878, -0.032497443, -0.0061812787, 0.002067329, 0.027306687, -0.014978643, -0.0010164079, -0.040311188, -0.028411103, 0.007358172, 0.0045246547, -0.04238197, 0.009463465, 0.002598829, 0.03570025, -0.0056394245, 0.038350847, 0.02611944, -0.028631987, 0.009125237, -0.0043072226, 0.050416593, -0.010664518, 0.019368697, -0.03252505, 0.01051266, 0.010954427, -0.017339332, -0.016069254, 0.008524711, 0.010388413, -0.013756882, -0.001641956, -0.0076411786, 0.026188467, 0.020500723, 0.019603385, 0.019851878, 0.0010862967, 0.0010034655, -0.010609297, -0.026133245, 0.013639539, -0.026091829, -0.009739569, 0.045888487, -0.02571909, 0.0020034797, 0.009028601, -0.0188441, -0.014951033, -0.01515811, -0.011541148, -0.011768933, 0.036086794, 0.018029593, -0.006233048, -0.005066509, -0.00046290565, -0.004055278, 0.024890777, 0.005553142, -0.019686216, 0.012825032, -0.008476393, -0.014633513, 0.01356361, -0.0025522364, -0.016718099, -0.03785386, 0.013094233, 0.017891541, 0.010022576, -0.010167531, 0.013135648, 0.003294266, -0.00086929626, -0.007779231, 0.016345358, -0.028328272, 0.025318738, -0.035451755, -0.0031734705, -0.0074064904, 0.006968175, 0.014799175, -0.031779572, -0.014730149, -0.026381738, -0.00069975114, -0.03843368, 0.055193193, 0.030261, 0.01324609, -0.014771565, 0.010657615, -0.05011288, -0.006277915, 0.019064981, 0.03826802, -0.023855386, -0.015227136, -0.0045177517, 0.0026816602, 0.012942376, 0.018733658, 0.006312428, 0.010726641, -0.0027627659, -0.09586331, 0.012279727, 0.017104644, -0.00063245074, 0.02240584, 0.0045833266, 0.044452745, -0.037715808, -0.0006505701, 0.00052287197, -0.035921134, -0.009891426, -0.0006423732, 0.007013042, -0.02027984, -0.009201166, 0.014633513, -0.002298566, 0.021494698, 0.026892532, 0.0034737336, 0.00549447, -0.0016238367, 0.010837083, -0.0150338635, 0.015199526, -0.014895812, 0.03779864, 0.012825032, 0.010747349, 0.0036238653, -0.010657615, -0.0061433143, 0.039565705, -0.022750972, -0.037909083, 0.001578107, -0.0006363335, -0.006588532, 0.0031493115, -0.02704439, 0.020638775, -0.007434101, -0.020321256, -0.008614445, -0.007931088, -0.017077034, 0.031917624, 0.027265271, -0.016966593, 0.0045281057, 0.017946761, 0.006812867, -0.0136878565, -0.036362898, -0.03216612, 0.026243687, -0.0019171973, -0.0064297724, -0.017159864, -0.009587712, 0.009656738, 0.02099771, -0.0083797565, 0.019630997, -0.004003508, -0.009097627, -0.015420409, 0.03782625, -0.018195255, -0.012638661, -0.01892693, 0.01409511, -0.0035789984, -0.02954313, 0.016124474, 0.0033546637, -0.014274578, -0.024807947, 0.02511166, -0.025387764, -0.021508504, -0.037356872, 0.009877621, 0.005642876, 0.02784509, -0.011340972, -0.014674928, -0.0067852563, 0.007931088, -0.023289373, 0.005014739, 0.0070302985, -0.00860064, -0.01478537, 0.038074743, -0.003063029, -0.019824268, 0.020017542, 0.014799175, 0.013266798, -0.0052494276, -0.0042520016, -0.0054392493, 0.00445908, 0.025939973, -0.028659597, -0.037246432, -0.010933719, 0.014246968, -0.011824154, 0.0025729444, 0.014039889, 0.01613828, -0.010077797, -0.004600583, 0.023634505, -0.03445778, -0.03561742, 0.017601632, 0.008186484, 0.027182441, -0.029101364, 0.01173442, 0.04533628, 0.012797421, -0.01205194, 0.0066506555, 0.005701548, -0.00037403466, -0.018402332, -0.023082295, -0.0025418827, -0.020031346, -0.015779344, 0.012790519, -0.0047662454, 0.035921134, -0.0027748453, 0.05897582, 0.012383265, 0.016925177, 0.017532606, 0.005791282, 0.0070510064, 0.002766217, -0.0055358857, -0.03492716, -0.017215086, -0.0019206486, -0.016773319, 0.04746228, 0.012065746, -0.05381267, 0.0018619765, 0.014385019, -0.0150200585, -0.024531841, 0.01996232, 0.03697033, -0.0143574085, 0.00910453, 0.0018809586, -0.0023037428, 0.017684462, 0.010678323, -0.004669609, 0.011755128, -0.030619936, 0.02327557, 0.0004033707, -0.0027990045, -0.026616428, 0.022875218, -0.022999465, -0.013101135, 0.022654334, 0.027803674, 0.004448726, 0.01136168, 0.014730149, -0.008290024, 0.00093098823, 0.027734648, -0.0074064904, -0.010623102, 0.00012834523, -0.012272824]}], 'model': 'text-embedding-ada-002-v2', 'usage': {'prompt_tokens': 18, 'total_tokens': 18, 'pre_token_count': 8191, 'pre_total': 5, 'adjust_total': 4, 'final_total': 1}}\n"
     ]
    }
   ],
   "source": [
    "import requests\n",
    "\n",
    "url = \"https://openai.api2d.net/v1/embeddings\"\n",
    "\n",
    "headers = {\n",
    "  'Content-Type': 'application/json',\n",
    "  'Authorization': 'Bearer fk212271-1JDMqa4Qtn4mggsgDqNsF6nVjqfRLw7O'\n",
    "}\n",
    "\n",
    "data = {\n",
    "    \"model\": \"text-embedding-ada-002\",\n",
    "    \"input\": \"魔兽世界坐骑去哪买\"\n",
    "}\n",
    "response = requests.post(url, headers=headers, json=data)\n",
    "print(\"Status Code\", response.status_code)\n",
    "print(\"JSON Response \", response.json())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "9b638b78-3745-4452-981f-3d58235123f8",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Status Code 404\n",
      "JSON Response  {'timestamp': '2024-01-21T17:30:54.138+00:00', 'status': 404, 'error': 'Not Found', 'path': '/v3/embeddings'}\n"
     ]
    }
   ],
   "source": [
    "import requests\n",
    "url = \"https://open.bigmodel.cn/api/paas/v4/embeddings\"\n",
    "\n",
    "headers = {\n",
    "  'Content-Type': 'application/json',\n",
    "  'Authorization': generate_token(\"83e5bc58555d8bac289e27bac50f8afc.Khk1JjCxb8MJN8Mi\", 1000)\n",
    "}\n",
    "\n",
    "data = {\n",
    "  \"model\": \"embedding-2\",\n",
    "  \"input\": \"测试文本，今天很开心。\"\n",
    "}\n",
    "\n",
    "response = requests.post(url, headers=headers, json=data)\n",
    "\n",
    "print(\"Status Code\", response.status_code)\n",
    "print(\"JSON Response \", response.json())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "21b4f77a-0af9-4bcd-8248-aa16e2a5e5a6",
   "metadata": {},
   "source": [
    "### Function call API"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "4fd74a72-4208-43ea-a3b5-72923f001896",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Status Code 200\n",
      "JSON Response  {'id': 'chatcmpl-8jVz8hPIpZHDznpSMBKcCXrOBAV35', 'object': 'chat.completion', 'created': 1705858402, 'model': 'gpt-3.5-turbo-0613', 'choices': [{'index': 0, 'message': {'role': 'assistant', 'content': None, 'function_call': {'name': 'get_connection', 'arguments': '{\\n  \"user_id1\": \"李华\",\\n  \"user_id2\": \"小王\"\\n}'}}, 'logprobs': None, 'finish_reason': 'function_call'}], 'usage': {'prompt_tokens': 88, 'completion_tokens': 30, 'total_tokens': 118, 'pre_token_count': 4096, 'pre_total': 42, 'adjust_total': 41, 'final_total': 1}, 'system_fingerprint': None}\n"
     ]
    }
   ],
   "source": [
    "import requests\n",
    "import json\n",
    "\n",
    "url = \"https://openai.api2d.net/v1/chat/completions\"\n",
    "\n",
    "headers = {\n",
    "    'Content-Type': 'application/json',\n",
    "    'Authorization': 'Bearer fk212271-1JDMqa4Qtn4mggsgDqNsF6nVjqfRLw7O'\n",
    "}\n",
    "\n",
    "data = {\n",
    "  \"model\": \"gpt-3.5-turbo-0613\", # \"gpt-4-0613\",\n",
    "  \"messages\": [\n",
    "    {\"role\": \"user\", \"content\": \"李华和小王是不是认识？\"},\n",
    "  ],\n",
    "  \"functions\": [\n",
    "    {\n",
    "      \"name\": \"get_connection\",\n",
    "      \"description\": \"判断用户1和用户2 是否为朋友关系\",\n",
    "      \"parameters\": {\n",
    "        \"type\": \"object\",\n",
    "        \"properties\": {\n",
    "          \"user_id1\": {\n",
    "            \"type\": \"string\",\n",
    "            \"description\": \"用户ID 1\"\n",
    "          },\n",
    "          \"user_id2\": {\n",
    "            \"type\": \"string\",\n",
    "            \"description\": \"用户ID 2\"\n",
    "          },\n",
    "        },\n",
    "        \"required\": [\"user_id1\", \"user_id2\"]\n",
    "      }\n",
    "    }\n",
    "  ]\n",
    "}\n",
    "\n",
    "response = requests.post(url, headers=headers, json=data)\n",
    "print(\"Status Code\", response.status_code)\n",
    "print(\"JSON Response \", response.json())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9b08bca2-c6a9-4f69-8dfd-4a47f1d58b47",
   "metadata": {},
   "source": [
    "## 任务3：读取汽车问答数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "76eab684-ac7b-488d-b269-a89f55832eaf",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'question': '“前排座椅通风”的相关内容在第几页？', 'answer': '', 'reference': ''}\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "'欢迎\\n感谢您选择了具有优良安全性、舒适性、动力性和经济性的Lynk&Co领克汽车。\\n首次使用前请仔细、完整地阅读本手册内容，将有助于您更好地了解和使用车辆。\\n本手册中的所有资料均为出版时的最新资料，但本公司将对产品进行不断的改进和优化，您所购的车辆可能与本手册中的描述有所不同，请以实际\\n接收的车辆为准。\\n如您有任何问题，或需要预约服务，请拨打电话4006-010101联系我们。您也可以开车前往Lynk&Co领克中心。\\n在抵达之前，请您注意驾车安全。\\n©领克汽车销售有限公司'"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import json\n",
    "import pdfplumber\n",
    "import torch\n",
    "import transformers\n",
    "import jieba\n",
    "import sklearn\n",
    "\n",
    "questions = json.load(open(\"questions.json\"))\n",
    "print(questions[0])\n",
    "\n",
    "pdf = pdfplumber.open(\"初赛训练数据集.pdf\")\n",
    "len(pdf.pages)\n",
    "pdf.pages[0].extract_text() # 可复制的PDF"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "a30f2f20-6ee0-4081-bee9-6f5dc8430d20",
   "metadata": {},
   "outputs": [],
   "source": [
    "pdf_content = []\n",
    "for page_idx in range(len(pdf.pages)):\n",
    "    pdf_content.append({\n",
    "        'page': 'page_' + str(page_idx + 1),\n",
    "        'content': pdf.pages[page_idx].extract_text()\n",
    "    })"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "45047d31-af58-4bd9-9334-be3ce7ea2fe4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'question': '“前排座椅通风”的相关内容在第几页？', 'answer': '', 'reference': ''},\n",
       " {'question': '\"关于车辆的儿童安全座椅固定装置，在哪一页可以找到相关内容？\"',\n",
       "  'answer': '',\n",
       "  'reference': ''},\n",
       " {'question': '“打开前机舱盖”的相关信息在第几页？', 'answer': '', 'reference': ''},\n",
       " {'question': '“打开前机舱盖”这个操作在哪一页？', 'answer': '', 'reference': ''},\n",
       " {'question': '“查看行车记录仪视频”这一项内容在第几页？', 'answer': '', 'reference': ''},\n",
       " {'question': '请问Lynk&Co领克汽车的事件数据记录系统（EDR）主要记录哪些信息？',\n",
       "  'answer': '',\n",
       "  'reference': ''},\n",
       " {'question': '问题：事件数据记录系统（EDR）中的数据是否可以被黑客利用进行恶意攻击？',\n",
       "  'answer': '',\n",
       "  'reference': ''},\n",
       " {'question': '问题：在国家环保法要求下，哪些情况下需要对车辆进行报废处理？', 'answer': '', 'reference': ''},\n",
       " {'question': '请问，如果车辆报废后，原车主是否还能使用该车辆的智能互联服务？',\n",
       "  'answer': '',\n",
       "  'reference': ''},\n",
       " {'question': '如何确保用车前的准备工作万无一失？', 'answer': '', 'reference': ''}]"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "questions[:10]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b9c3fdb0-484e-4435-9a66-8a0e14f974b2",
   "metadata": {},
   "source": [
    "## 任务4：文本索引与答案检索"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c8555401-ad70-4db2-bad2-0945d3f50ac4",
   "metadata": {},
   "source": [
    "### TFIDF"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "7abe6d86-0dd6-4c62-963f-82a2a7691ea8",
   "metadata": {},
   "outputs": [],
   "source": [
    "import jieba\n",
    "import numpy as np\n",
    "from sklearn.feature_extraction.text import TfidfVectorizer\n",
    "from sklearn.preprocessing import normalize"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "d08a7ac3-97b6-4fa9-813b-e8ce8a2e37f7",
   "metadata": {},
   "outputs": [],
   "source": [
    "question_words = [' '.join(jieba.lcut(x['question'])) for x in questions]\n",
    "pdf_content_words = [' '.join(jieba.lcut(x['content'])) for x in pdf_content]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "644f0483-6714-4f7b-ab6f-7772c9f36c7e",
   "metadata": {},
   "outputs": [],
   "source": [
    "tfidf = TfidfVectorizer()\n",
    "tfidf.fit(question_words + pdf_content_words)\n",
    "\n",
    "question_feat = tfidf.transform(question_words)\n",
    "pdf_content_feat = tfidf.transform(pdf_content_words)\n",
    "\n",
    "question_feat = normalize(question_feat)\n",
    "pdf_content_feat = normalize(pdf_content_feat)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "id": "b0f2c5fb-0172-41e8-803f-2509d8baa48f",
   "metadata": {},
   "outputs": [],
   "source": [
    "for query_idx, feat in enumerate(question_feat):\n",
    "    score = feat @ pdf_content_feat.T\n",
    "    score = score.toarray()[0]\n",
    "    max_score_page_idx = score.argsort()[-1] + 1\n",
    "\n",
    "    questions[query_idx]['reference'] = 'page_' + str(max_score_page_idx)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "id": "64a2e533-96e5-4255-bb86-09c96ab0ab8e",
   "metadata": {},
   "outputs": [],
   "source": [
    "with open('submit.json', 'w', encoding='utf8') as up:\n",
    "    json.dump(questions, up, ensure_ascii=False, indent=4)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e0ee12b2-6412-47b3-8ed3-8cec96906f04",
   "metadata": {},
   "source": [
    "### BM25"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "fa38627d-ab53-4071-8f64-d7108eb0ae15",
   "metadata": {},
   "outputs": [],
   "source": [
    "# !pip install rank_bm25\n",
    "from rank_bm25 import BM25Okapi\n",
    "\n",
    "pdf_content_words = [jieba.lcut(x['content']) for x in pdf_content]\n",
    "bm25 = BM25Okapi(pdf_content_words)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "id": "a6183ef7-e0e5-491f-97f6-58fb3088dfc0",
   "metadata": {},
   "outputs": [],
   "source": [
    "for query_idx in range(len(questions)):\n",
    "    doc_scores = bm25.get_scores(jieba.lcut(questions[query_idx][\"question\"]))\n",
    "    max_score_page_idx = doc_scores.argsort()[-1] + 1\n",
    "    questions[query_idx]['reference'] = 'page_' + str(max_score_page_idx)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "id": "25b9b944-9c97-4aa4-b1c6-9ec5d9e528d4",
   "metadata": {},
   "outputs": [],
   "source": [
    "with open('submit.json', 'w', encoding='utf8') as up:\n",
    "    json.dump(questions, up, ensure_ascii=False, indent=4)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2ec21252-76fe-465b-a9cd-d38b0a65da38",
   "metadata": {},
   "source": [
    "## 任务5：文本嵌入与向量检索"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b8104d40-cea7-488c-985c-678ec233296f",
   "metadata": {},
   "source": [
    "### M3E"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "id": "2f84d6d5-f26c-4ab4-a365-55d942f81b6a",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sentence_transformers import SentenceTransformer\n",
    "model = SentenceTransformer('../hugging-face-model/moka-ai/m3e-small/')\n",
    "\n",
    "question_sentences = [x['question'] for x in questions]\n",
    "pdf_content_sentences = [x['content'] for x in pdf_content]\n",
    "\n",
    "question_embeddings = model.encode(question_sentences, normalize_embeddings=True)\n",
    "pdf_embeddings = model.encode(pdf_content_sentences, normalize_embeddings=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "id": "9bd89583-0b2c-4add-8d4e-f52200a0b73e",
   "metadata": {},
   "outputs": [],
   "source": [
    "for query_idx, feat in enumerate(question_embeddings):\n",
    "    score = feat @ pdf_embeddings.T\n",
    "    max_score_page_idx = score.argsort()[-1] + 1\n",
    "    questions[query_idx]['reference'] = 'page_' + str(max_score_page_idx)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "id": "3c79924f-29db-4c7a-adee-f9de0fcf8737",
   "metadata": {},
   "outputs": [],
   "source": [
    "with open('submit.json', 'w', encoding='utf8') as up:\n",
    "    json.dump(questions, up, ensure_ascii=False, indent=4)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "db3613d2-45aa-4cd7-b637-94f4ac539c6f",
   "metadata": {},
   "source": [
    "### BGE"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "id": "7cebd8e5-c0af-4f1a-be9c-932dc12b2aa4",
   "metadata": {},
   "outputs": [],
   "source": [
    "model = SentenceTransformer('../hugging-face-model/BAAI/bge-small-zh-v1.5/')\n",
    "\n",
    "question_sentences = [x['question'] for x in questions]\n",
    "pdf_content_sentences = [x['content'] for x in pdf_content]\n",
    "\n",
    "question_embeddings = model.encode(question_sentences, normalize_embeddings=True)\n",
    "pdf_embeddings = model.encode(pdf_content_sentences, normalize_embeddings=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "id": "8fd0b450-ae5a-4beb-be7f-dc2921e60076",
   "metadata": {},
   "outputs": [],
   "source": [
    "for query_idx, feat in enumerate(question_embeddings):\n",
    "    score = feat @ pdf_embeddings.T\n",
    "    max_score_page_idx = score.argsort()[-1] + 1\n",
    "    questions[query_idx]['reference'] = 'page_' + str(max_score_page_idx)\n",
    "\n",
    "with open('submit.json', 'w', encoding='utf8') as up:\n",
    "    json.dump(questions, up, ensure_ascii=False, indent=4)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "482219bb-c6fd-44bf-81b0-e22c877678f9",
   "metadata": {},
   "source": [
    "### BCEmbedding"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "3c5389af-ca89-4a86-b7bf-638db897130b",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sentence_transformers import SentenceTransformer\n",
    "model = SentenceTransformer(\"../hugging-face-model/maidalun1020/bce-embedding-base_v1\", device='cuda')\n",
    "model.max_seq_length = 512\n",
    "\n",
    "question_sentences = [x['question'] for x in questions]\n",
    "pdf_content_sentences = [x['content'] for x in pdf_content]\n",
    "\n",
    "question_embeddings = model.encode(question_sentences, normalize_embeddings=True)\n",
    "pdf_embeddings = model.encode(pdf_content_sentences, normalize_embeddings=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "330c2603-e5e1-4318-b068-a7f8936bd924",
   "metadata": {},
   "outputs": [],
   "source": [
    "for query_idx, feat in enumerate(question_embeddings):\n",
    "    score = feat @ pdf_embeddings.T\n",
    "    max_score_page_idx = score.argsort()[-1] + 1\n",
    "    questions[query_idx]['reference'] = 'page_' + str(max_score_page_idx)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "35f503ef-540a-4faf-b3b7-5f448e6d3e81",
   "metadata": {},
   "outputs": [],
   "source": [
    "with open('submit.json', 'w', encoding='utf8') as up:\n",
    "    json.dump(questions, up, ensure_ascii=False, indent=4)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "42c9a7ab-43f2-42ed-85b5-cdbdfa79d44c",
   "metadata": {},
   "source": [
    "## 任务6：文本多路召回与重排序"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "822a0bd8-804e-43d1-9768-e78a814507aa",
   "metadata": {},
   "source": [
    "### BM25 + BGE"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "37bda31b-85ad-495b-b93c-07f340a74bf6",
   "metadata": {},
   "outputs": [],
   "source": [
    "import jieba, json, pdfplumber\n",
    "import numpy as np\n",
    "from sklearn.feature_extraction.text import TfidfVectorizer\n",
    "from sklearn.preprocessing import normalize\n",
    "from rank_bm25 import BM25Okapi\n",
    "import torch\n",
    "from sentence_transformers import SentenceTransformer\n",
    "\n",
    "questions = json.load(open(\"questions.json\"))\n",
    "\n",
    "pdf = pdfplumber.open(\"初赛训练数据集.pdf\")\n",
    "pdf_content = []\n",
    "for page_idx in range(len(pdf.pages)):\n",
    "    pdf_content.append({\n",
    "        'page': 'page_' + str(page_idx + 1),\n",
    "        'content': pdf.pages[page_idx].extract_text()\n",
    "    })"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "f1a7bcc9-566e-4128-a869-7349c2e613da",
   "metadata": {},
   "outputs": [],
   "source": [
    "pdf_content_words = [jieba.lcut(x['content']) for x in pdf_content]\n",
    "bm25 = BM25Okapi(pdf_content_words)\n",
    "\n",
    "model = SentenceTransformer('../hugging-face-model/BAAI/bge-small-zh-v1.5/')\n",
    "question_sentences = [x['question'] for x in questions]\n",
    "pdf_content_sentences = [x['content'] for x in pdf_content]\n",
    "\n",
    "question_embeddings = model.encode(question_sentences, normalize_embeddings=True)\n",
    "pdf_embeddings = model.encode(pdf_content_sentences, normalize_embeddings=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "eb23ecec-ca51-4164-b683-3775f19d923b",
   "metadata": {},
   "outputs": [],
   "source": [
    "from scipy.stats import rankdata\n",
    "\n",
    "for query_idx, feat in enumerate(question_embeddings):\n",
    "    score1 = feat @ pdf_embeddings.T\n",
    "    score2 = bm25.get_scores(jieba.lcut(questions[query_idx][\"question\"]))\n",
    "\n",
    "    score = rankdata(score1) + rankdata(score2)\n",
    "    max_score_page_idx = score.argsort()[-1] + 1\n",
    "    questions[query_idx]['reference'] = 'page_' + str(max_score_page_idx)\n",
    "\n",
    "with open('submit.json', 'w', encoding='utf8') as up:\n",
    "    json.dump(questions, up, ensure_ascii=False, indent=4)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "193b994e-ebe9-4c98-851b-f88332b9e499",
   "metadata": {},
   "source": [
    "### BGE/Text Segment"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "2037088e-ae37-480d-a2a4-18d6791c2f41",
   "metadata": {},
   "outputs": [],
   "source": [
    "import jieba, json, pdfplumber\n",
    "import numpy as np\n",
    "from sklearn.feature_extraction.text import TfidfVectorizer\n",
    "from sklearn.preprocessing import normalize\n",
    "from rank_bm25 import BM25Okapi\n",
    "import torch\n",
    "from sentence_transformers import SentenceTransformer\n",
    "\n",
    "questions = json.load(open(\"questions.json\"))\n",
    "\n",
    "pdf = pdfplumber.open(\"初赛训练数据集.pdf\")\n",
    "pdf_content = []\n",
    "\n",
    "def split_text_fixed_size(text, chunk_size):\n",
    "    return [text[i:i+chunk_size] for i in range(0, len(text), chunk_size)]\n",
    "\n",
    "for page_idx in range(len(pdf.pages)):\n",
    "    text = pdf.pages[page_idx].extract_text()\n",
    "    for chunk_text in split_text_fixed_size(text, 40):\n",
    "        pdf_content.append({\n",
    "            'page': 'page_' + str(page_idx + 1),\n",
    "            'content': chunk_text\n",
    "        })\n",
    "\n",
    "model = SentenceTransformer('../hugging-face-model/BAAI/bge-small-zh-v1.5/')\n",
    "question_sentences = [x['question'] for x in questions]\n",
    "pdf_content_sentences = [x['content'] for x in pdf_content]\n",
    "\n",
    "question_embeddings = model.encode(question_sentences, normalize_embeddings=True)\n",
    "pdf_embeddings = model.encode(pdf_content_sentences, normalize_embeddings=True)\n",
    "\n",
    "for query_idx, feat in enumerate(question_embeddings):\n",
    "    score = feat @ pdf_embeddings.T\n",
    "    max_score_page_idx = score.argsort()[-1]\n",
    "    questions[query_idx]['reference'] = pdf_content[max_score_page_idx]['page']\n",
    "\n",
    "with open('submit.json', 'w', encoding='utf8') as up:\n",
    "    json.dump(questions, up, ensure_ascii=False, indent=4)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "104fcf9a-cd33-466b-9b87-6f164c42af84",
   "metadata": {},
   "source": [
    "### BM25 + BGE/Text Segment"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "7bdce92f-a47e-426c-87bb-f169da898464",
   "metadata": {},
   "outputs": [],
   "source": [
    "import jieba, json, pdfplumber\n",
    "import numpy as np\n",
    "from sklearn.feature_extraction.text import TfidfVectorizer\n",
    "from sklearn.preprocessing import normalize\n",
    "from rank_bm25 import BM25Okapi\n",
    "import torch\n",
    "from sentence_transformers import SentenceTransformer\n",
    "\n",
    "questions = json.load(open(\"questions.json\"))\n",
    "pdf = pdfplumber.open(\"初赛训练数据集.pdf\")\n",
    "pdf_content = []\n",
    "\n",
    "def split_text_fixed_size(text, chunk_size):\n",
    "    return [text[i:i+chunk_size] for i in range(0, len(text), chunk_size)]\n",
    "\n",
    "for page_idx in range(len(pdf.pages)):\n",
    "    text = pdf.pages[page_idx].extract_text()\n",
    "    for chunk_text in split_text_fixed_size(text, 40):\n",
    "        pdf_content.append({\n",
    "            'page': 'page_' + str(page_idx + 1),\n",
    "            'content': chunk_text\n",
    "        })\n",
    "\n",
    "pdf_content_words = [jieba.lcut(x['content']) for x in pdf_content]\n",
    "bm25 = BM25Okapi(pdf_content_words)\n",
    "\n",
    "model = SentenceTransformer('../hugging-face-model/BAAI/bge-small-zh-v1.5/')\n",
    "question_sentences = [x['question'] for x in questions]\n",
    "pdf_content_sentences = [x['content'] for x in pdf_content]\n",
    "\n",
    "question_embeddings = model.encode(question_sentences, normalize_embeddings=True)\n",
    "pdf_embeddings = model.encode(pdf_content_sentences, normalize_embeddings=True)\n",
    "\n",
    "from scipy.stats import rankdata\n",
    "for query_idx, feat in enumerate(question_embeddings):\n",
    "    score1 = feat @ pdf_embeddings.T\n",
    "    score2 = bm25.get_scores(jieba.lcut(questions[query_idx][\"question\"]))\n",
    "\n",
    "    score = rankdata(score1) + rankdata(score2)\n",
    "    max_score_page_idx = score.argsort()[-1]\n",
    "    questions[query_idx]['reference'] = pdf_content[max_score_page_idx]['page']\n",
    "\n",
    "with open('submit.json', 'w', encoding='utf8') as up:\n",
    "    json.dump(questions, up, ensure_ascii=False, indent=4)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9bd9b7b9-b8fe-4a84-82cd-8e09da1f906a",
   "metadata": {},
   "source": [
    "### BM25 with ReRank"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "a634a54d-7693-4fa6-84b3-212b2985d746",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "XLMRobertaForSequenceClassification(\n",
       "  (roberta): XLMRobertaModel(\n",
       "    (embeddings): XLMRobertaEmbeddings(\n",
       "      (word_embeddings): Embedding(250002, 768, padding_idx=1)\n",
       "      (position_embeddings): Embedding(514, 768, padding_idx=1)\n",
       "      (token_type_embeddings): Embedding(1, 768)\n",
       "      (LayerNorm): LayerNorm((768,), eps=1e-05, elementwise_affine=True)\n",
       "      (dropout): Dropout(p=0.1, inplace=False)\n",
       "    )\n",
       "    (encoder): XLMRobertaEncoder(\n",
       "      (layer): ModuleList(\n",
       "        (0-11): 12 x XLMRobertaLayer(\n",
       "          (attention): XLMRobertaAttention(\n",
       "            (self): XLMRobertaSelfAttention(\n",
       "              (query): Linear(in_features=768, out_features=768, bias=True)\n",
       "              (key): Linear(in_features=768, out_features=768, bias=True)\n",
       "              (value): Linear(in_features=768, out_features=768, bias=True)\n",
       "              (dropout): Dropout(p=0.1, inplace=False)\n",
       "            )\n",
       "            (output): XLMRobertaSelfOutput(\n",
       "              (dense): Linear(in_features=768, out_features=768, bias=True)\n",
       "              (LayerNorm): LayerNorm((768,), eps=1e-05, elementwise_affine=True)\n",
       "              (dropout): Dropout(p=0.1, inplace=False)\n",
       "            )\n",
       "          )\n",
       "          (intermediate): XLMRobertaIntermediate(\n",
       "            (dense): Linear(in_features=768, out_features=3072, bias=True)\n",
       "            (intermediate_act_fn): GELUActivation()\n",
       "          )\n",
       "          (output): XLMRobertaOutput(\n",
       "            (dense): Linear(in_features=3072, out_features=768, bias=True)\n",
       "            (LayerNorm): LayerNorm((768,), eps=1e-05, elementwise_affine=True)\n",
       "            (dropout): Dropout(p=0.1, inplace=False)\n",
       "          )\n",
       "        )\n",
       "      )\n",
       "    )\n",
       "  )\n",
       "  (classifier): XLMRobertaClassificationHead(\n",
       "    (dense): Linear(in_features=768, out_features=768, bias=True)\n",
       "    (dropout): Dropout(p=0.1, inplace=False)\n",
       "    (out_proj): Linear(in_features=768, out_features=1, bias=True)\n",
       "  )\n",
       ")"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import jieba, json, pdfplumber\n",
    "import numpy as np\n",
    "from sklearn.feature_extraction.text import TfidfVectorizer\n",
    "from sklearn.preprocessing import normalize\n",
    "from rank_bm25 import BM25Okapi\n",
    "import torch\n",
    "from transformers import AutoModelForSequenceClassification, AutoTokenizer\n",
    "\n",
    "questions = json.load(open(\"questions.json\"))\n",
    "\n",
    "pdf = pdfplumber.open(\"初赛训练数据集.pdf\")\n",
    "pdf_content = []\n",
    "for page_idx in range(len(pdf.pages)):\n",
    "    pdf_content.append({\n",
    "        'page': 'page_' + str(page_idx + 1),\n",
    "        'content': pdf.pages[page_idx].extract_text()\n",
    "    })\n",
    "\n",
    "tokenizer = AutoTokenizer.from_pretrained('../hugging-face-model/BAAI/bge-reranker-base/')\n",
    "rerank_model = AutoModelForSequenceClassification.from_pretrained('../hugging-face-model/BAAI/bge-reranker-base/')\n",
    "rerank_model.cuda()\n",
    "rerank_model.eval()\n",
    "\n",
    "pdf_content_words = [jieba.lcut(x['content']) for x in pdf_content]\n",
    "bm25 = BM25Okapi(pdf_content_words)\n",
    "\n",
    "for query_idx in range(len(questions)):\n",
    "    doc_scores = bm25.get_scores(jieba.lcut(questions[query_idx][\"question\"]))\n",
    "    max_score_page_idxs = doc_scores.argsort()[-3:]\n",
    "\n",
    "    pairs = []\n",
    "    for idx in max_score_page_idxs:\n",
    "        pairs.append([questions[query_idx][\"question\"], pdf_content[idx]['content']])\n",
    "\n",
    "    inputs = tokenizer(pairs, padding=True, truncation=True, return_tensors='pt', max_length=512)\n",
    "    with torch.no_grad():\n",
    "        inputs = {key: inputs[key].cuda() for key in inputs.keys()}\n",
    "        scores = rerank_model(**inputs, return_dict=True).logits.view(-1, ).float()\n",
    "\n",
    "    max_score_page_idx = max_score_page_idxs[scores.cpu().numpy().argmax()]\n",
    "    questions[query_idx]['reference'] = 'page_' + str(max_score_page_idx + 1)\n",
    "\n",
    "with open('submit.json', 'w', encoding='utf8') as up:\n",
    "    json.dump(questions, up, ensure_ascii=False, indent=4)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fa37da7f-f186-4a89-bc95-c16388ac796b",
   "metadata": {},
   "source": [
    "## 任务7：文本问答Promopt优化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "b88383e2-177a-4b75-a879-efc697c0b9c6",
   "metadata": {},
   "outputs": [],
   "source": [
    "import time\n",
    "import jwt\n",
    "import requests\n",
    "from tqdm import tqdm\n",
    "\n",
    "import jieba, json, pdfplumber\n",
    "import numpy as np\n",
    "from sklearn.feature_extraction.text import TfidfVectorizer\n",
    "from sklearn.preprocessing import normalize\n",
    "from rank_bm25 import BM25Okapi\n",
    "import torch\n",
    "from transformers import AutoModelForSequenceClassification, AutoTokenizer\n",
    "\n",
    "# 实际KEY，过期时间\n",
    "def generate_token(apikey: str, exp_seconds: int):\n",
    "    try:\n",
    "        id, secret = apikey.split(\".\")\n",
    "    except Exception as e:\n",
    "        raise Exception(\"invalid apikey\", e)\n",
    "\n",
    "    payload = {\n",
    "        \"api_key\": id,\n",
    "        \"exp\": int(round(time.time() * 1000)) + exp_seconds * 1000,\n",
    "        \"timestamp\": int(round(time.time() * 1000)),\n",
    "    }\n",
    "    return jwt.encode(\n",
    "        payload,\n",
    "        secret,\n",
    "        algorithm=\"HS256\",\n",
    "        headers={\"alg\": \"HS256\", \"sign_type\": \"SIGN\"},\n",
    "    )\n",
    "\n",
    "def ask_glm(content):\n",
    "    url = \"https://open.bigmodel.cn/api/paas/v4/chat/completions\"\n",
    "    headers = {\n",
    "      'Content-Type': 'application/json',\n",
    "      'Authorization': generate_token(\"83e5bc58555d8bac289e27bac50f8afc.Khk1JjCxb8MJN8Mi\", 1000)\n",
    "    }\n",
    "\n",
    "    data = {\n",
    "        \"model\": \"glm-4\",\n",
    "        \"messages\": [{\"role\": \"user\", \"content\": content}]\n",
    "    }\n",
    "\n",
    "    response = requests.post(url, headers=headers, json=data)\n",
    "    return response.json()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "56a67bb5-6cf1-41f5-a479-a10dd9d5e18b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "XLMRobertaForSequenceClassification(\n",
       "  (roberta): XLMRobertaModel(\n",
       "    (embeddings): XLMRobertaEmbeddings(\n",
       "      (word_embeddings): Embedding(250002, 768, padding_idx=1)\n",
       "      (position_embeddings): Embedding(514, 768, padding_idx=1)\n",
       "      (token_type_embeddings): Embedding(1, 768)\n",
       "      (LayerNorm): LayerNorm((768,), eps=1e-05, elementwise_affine=True)\n",
       "      (dropout): Dropout(p=0.1, inplace=False)\n",
       "    )\n",
       "    (encoder): XLMRobertaEncoder(\n",
       "      (layer): ModuleList(\n",
       "        (0-11): 12 x XLMRobertaLayer(\n",
       "          (attention): XLMRobertaAttention(\n",
       "            (self): XLMRobertaSelfAttention(\n",
       "              (query): Linear(in_features=768, out_features=768, bias=True)\n",
       "              (key): Linear(in_features=768, out_features=768, bias=True)\n",
       "              (value): Linear(in_features=768, out_features=768, bias=True)\n",
       "              (dropout): Dropout(p=0.1, inplace=False)\n",
       "            )\n",
       "            (output): XLMRobertaSelfOutput(\n",
       "              (dense): Linear(in_features=768, out_features=768, bias=True)\n",
       "              (LayerNorm): LayerNorm((768,), eps=1e-05, elementwise_affine=True)\n",
       "              (dropout): Dropout(p=0.1, inplace=False)\n",
       "            )\n",
       "          )\n",
       "          (intermediate): XLMRobertaIntermediate(\n",
       "            (dense): Linear(in_features=768, out_features=3072, bias=True)\n",
       "            (intermediate_act_fn): GELUActivation()\n",
       "          )\n",
       "          (output): XLMRobertaOutput(\n",
       "            (dense): Linear(in_features=3072, out_features=768, bias=True)\n",
       "            (LayerNorm): LayerNorm((768,), eps=1e-05, elementwise_affine=True)\n",
       "            (dropout): Dropout(p=0.1, inplace=False)\n",
       "          )\n",
       "        )\n",
       "      )\n",
       "    )\n",
       "  )\n",
       "  (classifier): XLMRobertaClassificationHead(\n",
       "    (dense): Linear(in_features=768, out_features=768, bias=True)\n",
       "    (dropout): Dropout(p=0.1, inplace=False)\n",
       "    (out_proj): Linear(in_features=768, out_features=1, bias=True)\n",
       "  )\n",
       ")"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tokenizer = AutoTokenizer.from_pretrained('../hugging-face-model/BAAI/bge-reranker-base/')\n",
    "rerank_model = AutoModelForSequenceClassification.from_pretrained('../hugging-face-model/BAAI/bge-reranker-base/')\n",
    "rerank_model.cuda()\n",
    "rerank_model.eval()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "90bf5cd3-6032-4c1c-932f-90992b5fb635",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 27%|██▋       | 81/301 [08:33<31:24,  8.57s/it]"
     ]
    }
   ],
   "source": [
    "questions = json.load(open(\"questions.json\"))\n",
    "pdf = pdfplumber.open(\"初赛训练数据集.pdf\")\n",
    "pdf_content = []\n",
    "for page_idx in range(len(pdf.pages)):\n",
    "    pdf_content.append({\n",
    "        'page': 'page_' + str(page_idx + 1),\n",
    "        'content': pdf.pages[page_idx].extract_text()\n",
    "    })\n",
    "\n",
    "pdf_content_words = [jieba.lcut(x['content']) for x in pdf_content]\n",
    "bm25 = BM25Okapi(pdf_content_words)\n",
    "\n",
    "for query_idx in tqdm(range(len(questions))):\n",
    "    doc_scores = bm25.get_scores(jieba.lcut(questions[query_idx][\"question\"]))\n",
    "    max_score_page_idxs = doc_scores.argsort()[-4:]\n",
    "\n",
    "    pairs = []\n",
    "    for idx in max_score_page_idxs:\n",
    "        pairs.append([questions[query_idx][\"question\"], pdf_content[idx]['content']])\n",
    "\n",
    "    inputs = tokenizer(pairs, padding=True, truncation=True, return_tensors='pt', max_length=512)\n",
    "    with torch.no_grad():\n",
    "        inputs = {key: inputs[key].cuda() for key in inputs.keys()}\n",
    "        scores = rerank_model(**inputs, return_dict=True).logits.view(-1, ).float()\n",
    "    max_score_page_idx = max_score_page_idxs[scores.cpu().numpy().argmax()]\n",
    "    questions[query_idx]['reference'] = 'page_' + str(max_score_page_idx + 1)\n",
    "\n",
    "    prompt = '''你是一个汽车专家，帮我结合给定的资料，回答下面的问题。如果问题无法从资料中获得，或无法从资料中进行回答，请无法回答问题。如果问题可以从资料中获得，则请逐步回答。\n",
    "资料：{0}\n",
    "\n",
    "问题：{1}\n",
    "    '''.format(\n",
    "        pdf_content[max_score_page_idx]['content'],\n",
    "        questions[query_idx][\"question\"]\n",
    "    )\n",
    "    answer = ask_glm(prompt)['choices'][0]['message']['content']\n",
    "\n",
    "    if '无法回答' in answer:\n",
    "        answer = '结合给定的资料，无法回答问题。'\n",
    "    \n",
    "    questions[query_idx]['answer'] = answer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "9523edcf-43a3-4343-8a55-b665903fd92b",
   "metadata": {},
   "outputs": [],
   "source": [
    "with open('submit.json', 'w', encoding='utf8') as up:\n",
    "    json.dump(questions, up, ensure_ascii=False, indent=4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "b180fa5e-96ac-4779-aefc-a05359ca1f31",
   "metadata": {},
   "outputs": [],
   "source": [
    "import json\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "96cc5e15-33b4-4c4d-bae4-c99f5cc2e962",
   "metadata": {},
   "outputs": [],
   "source": [
    "label = json.load(open('汽车知识问答_label.json'))\n",
    "pred = json.load(open('submit_fusion_bge+bm25_rerank_retrieval_glm4.json'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "2b7745b9-f069-4f48-bc2f-b93b7fedafdb",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'question': '\"关于车辆的儿童安全座椅固定装置，在哪一页可以找到相关内容？\"', 'answer': '122', 'reference': 'page_4 page_122'} {'question': '\"关于车辆的儿童安全座椅固定装置，在哪一页可以找到相关内容？\"', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_123'}\n",
      "\n",
      "{'question': '如何确保用车前的准备工作万无一失？', 'answer': '确保用车前的准备工作万无一失，需要遵循以下步骤：\\n\\n1. 检查车辆状况：包括发动机、刹车、轮胎、灯光等关键部件的工作情况。\\n2. 加油：确保油箱中有足够的汽油，以满足预计的行车需求。\\n3. 检查液体：确认冷却液、制动液、转向助力液等液位正常。\\n4. 检查轮胎：轮胎气压适宜，没有破损或异物附着。\\n5. 检查工具：随车携带必要的工具，如备胎、千斤顶、灭火器等。\\n6. 检查文档：携带车辆行驶证、驾驶证、保险单等法律要求的文档。\\n7. 清洁车辆：保持车辆内外清洁，有利于驾驶时的视线清晰。\\n8. 检查预约情况：如果是预约修车或保养，确保按时到达。\\n9. 确认行程：提前规划好行车路线，了解路况信息。\\n10. 安全检查：确保安全带完好，儿童座椅正确安装（如有需要）。\\n\\n完成以上步骤，可以最大程度地确保用车前的准备工作万无一失。', 'reference': 'page_17 page_18'} {'question': '如何确保用车前的准备工作万无一失？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_15'}\n",
      "\n",
      "{'question': '装载货物时，车内有哪些储物空间可以利用？', 'answer': '车内储物空间包括：遮阳板上的卡片/票据夹、手套箱、车门存储空间、眼镜盒、前副仪表台、前排中央扶手储物箱以及前副仪表台侧网兜。', 'reference': 'page_22'} {'question': '装载货物时，车内有哪些储物空间可以利用？', 'answer': '根据给定的资料，装载货物时可以利用的车内储物空间有以下几处：第二排储物空间、前排座椅靠背上的储物袋、车门储物空间、后扶手上的杯托、衣帽钩。', 'reference': 'page_26'}\n",
      "\n",
      "{'question': '如何确保在装载货物时汽车的安全性？', 'answer': '确保在装载货物时汽车的安全性，需要遵循以下几个关键步骤：\\n\\n1. 了解并遵守车辆的载重限制，包括轴重、总重和车重限制。\\n2. 正确计算装载的货物重量，确保不会超载。\\n3. 均匀分布货物重量，避免车辆重心过高或过低。\\n4. 使用适当的装载设备和工具，如绑带、网格、楔木等，以固定和稳定货物。\\n5. 避免在高速行驶或转弯时装卸货物，以减少货物移动的风险。\\n6. 定期检查车辆的轮胎、制动系统和悬挂系统，确保它们适合装载货物。\\n7. 在长途运输中，定期停车检查货物的固定情况，防止松动。\\n8. 考虑使用专业的物流服务，他们通常有适当的设备和技术来确保货物安全。', 'reference': 'page_36'} {'question': '如何确保在装载货物时汽车的安全性？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_29'}\n",
      "\n",
      "{'question': '请问这辆正在装载货物的汽车最多可以装载多少立方米的货物？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_36'} {'question': '请问这辆正在装载货物的汽车最多可以装载多少立方米的货物？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_21'}\n",
      "\n",
      "{'question': '如何确保遥控钥匙的操作不受干扰？', 'answer': '确保遥控钥匙的操作不受干扰，您可以采取以下措施：\\n\\n1. 保持车辆远离无线电塔、电视塔、发电站等可能产生无线干扰的环境。\\n2. 避免在车辆周围使用或放置无线设备，如发射机、无线电广播设备等。\\n3. 不要让遥控钥匙接触或被金属材料覆盖，因为这可能会阻碍信号传输。\\n4. 确保遥控钥匙远离计算机、手机、无线鼠标等可能产生干扰的电子设备。\\n5. 定期检查遥控钥匙的电量，确保其充足。如果电量不足，应及时为钥匙充电。\\n\\n遵循以上措施，可以有效减少遥控钥匙操作受到的干扰。', 'reference': 'page_42'} {'question': '如何确保遥控钥匙的操作不受干扰？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_303'}\n",
      "\n",
      "{'question': '请问如何调整方向盘的高度和倾斜角度？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_56'} {'question': '请问如何调整方向盘的高度和倾斜角度？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_150'}\n",
      "\n",
      "{'question': '请问如何调整方向盘的高度和倾斜角度？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_58'} {'question': '请问如何调整方向盘的高度和倾斜角度？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_150'}\n",
      "\n",
      "{'question': '问题：智能远近光控制系统故障警告灯点亮后，驾驶员应该如何操作以保证安全行驶？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_72'} {'question': '问题：智能远近光控制系统故障警告灯点亮后，驾驶员应该如何操作以保证安全行驶？', 'answer': '驾驶员应立即将车辆停放在安全地点，并尽快联系Lynk&Co领克中心。继续驾驶车辆可能会导致危险，因此需要专业的技师检查并修复智能远近光控制系统故障。所以驾驶员在故障灯点亮后应该停车并联系专业维修人员以保证安全行驶。', 'reference': 'page_76'}\n",
      "\n",
      "{'question': '问题：盲点监测系统出现故障时，盲点监测故障警告灯常亮，那么当盲点监测系统标定未完成时，该警告灯会如何显示？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_74'} {'question': '问题：盲点监测系统出现故障时，盲点监测故障警告灯常亮，那么当盲点监测系统标定未完成时，该警告灯会如何显示？', 'answer': '当盲点监测系统标定未完成时，该警告灯会闪烁。', 'reference': 'page_78'}\n",
      "\n",
      "{'question': '问题：如果车辆的变速器故障警告灯点亮，但变速器性能并未降低，那么可能的原因是什么？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_76'} {'question': '问题：如果车辆的变速器故障警告灯点亮，但变速器性能并未降低，那么可能的原因是什么？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_71'}\n",
      "\n",
      "{'question': '如何在行驶过程中快速切换远近光灯？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_82'} {'question': '如何在行驶过程中快速切换远近光灯？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_85'}\n",
      "\n",
      "{'question': '问题：如何调整车辆的仪表盘亮度？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_90'} {'question': '问题：如何调整车辆的仪表盘亮度？', 'answer': '请参考调节背光亮度（页码91）。', 'reference': 'page_264'}\n",
      "\n",
      "{'question': '请问如何调整汽车仪表盘上的亮度？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_96'} {'question': '请问如何调整汽车仪表盘上的亮度？', 'answer': '根据给定资料，调整汽车仪表盘上的亮度可以通过转动调光旋钮进行。在白天情况下，如果未开启整车背光联动，则转动调光旋钮仅调节开关背光的亮度。如果开启整车背光联动，则转动调光旋钮可同时调节中央显示屏和开关背光的亮度。在夜晚情况下，未开启整车背光联动时，转动调光旋钮可同时调节仪表显示屏和开关背光的亮度，而开启整车背光联动时，转动调光旋钮可同时调节仪表显示屏、中央显示屏和开关背光的亮度。', 'reference': 'page_91'}\n",
      "\n",
      "{'question': '如何通过中央显示屏设置车窗和遮阳帘的功能？', 'answer': '通过中央显示屏 - 车辆设置 - 车窗和遮阳帘，您可以进行车窗和遮阳帘的相关设置。', 'reference': 'page_108'} {'question': '如何通过中央显示屏设置车窗和遮阳帘的功能？', 'answer': '通过点击中央显示屏 -车辆设置-车窗和遮阳帘进入设置界面，可以打开或关闭锁车自动关窗功能。短按遥控钥匙上的按钮可以在锁止车辆的同时关闭所有车窗和全景天窗。长按遥控钥匙上的按钮可以关闭所有车窗和全景天窗。', 'reference': 'page_111'}\n",
      "\n",
      "{'question': '如何确保儿童在车内时的安全？', 'answer': '确保儿童在车内时的安全，需要驾驶员对其他乘员的操作负责，并指导其他乘员正确操作天窗。具体措施包括：\\n\\n1. 严禁儿童操作全景天窗。\\n2. 严禁将儿童独自留在车内，因为儿童可能会无意间操作车内开关或控制按钮。\\n3. 严禁将头、手等任何身体部位伸出天窗外。\\n4. 在打开天窗之前，请清除车顶玻璃上的雪、冰或沙子。\\n5. 请勿在天窗顶部放置重物。\\n6. 及时清除天窗滑轨内的沙石、树叶等异物，避免造成天窗滑动过程中卡滞或无法正常开启、关闭。\\n7. 如果临时断开蓄电池的连接或者升级车辆软件，可能会导致天窗自动开启/关闭和防夹功能无法正常工作，建议联系Lynk&Co领克中心。', 'reference': 'page_112'} {'question': '如何确保儿童在车内时的安全？', 'answer': '儿童在车内时的安全可以通过以下方式来确保：\\n1. 确保儿童乘坐适合其年龄和体型的儿童安全座椅。\\n2. 使用儿童锁来防止儿童从车内打开后门，以防止儿童意外离开车辆或受到危险。\\n3. 不得在受到正面安全气囊保护的座位上使用后向儿童约束系统。\\n4. 遵守所有相关的儿童安全乘车规定和建议，如正确佩戴安全带等。', 'reference': 'page_122'}\n",
      "\n",
      "{'question': '请问：如果车辆在行驶过程中，无线充电板发生故障，应该如何处理？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_130'} {'question': '请问：如果车辆在行驶过程中，无线充电板发生故障，应该如何处理？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_135'}\n",
      "\n",
      "{'question': '请问车辆中能为哪些设备提供充电服务？', 'answer': '车辆中能为手机/U盘及平板等智能设备提供充电服务。', 'reference': 'page_132'} {'question': '请问车辆中能为哪些设备提供充电服务？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_295'}\n",
      "\n",
      "{'question': '请问车辆的无线充电功能在哪些情况下可能无法正常工作？', 'answer': '车辆的无线充电功能可能无法在以下情况下正常工作：\\n\\n1. 手机不支持无线充电协议。\\n2. 手机放置位置或距离超出充电区域。\\n3. 每次只能对1部手机进行充电。\\n4. 手机壳太厚，影响无线充电。\\n5. 车辆在颠簸路面行驶时，导致充电间歇性停止和恢复。\\n6. 手机温度过高时，车辆会进行电池保护，暂停充电，直到手机温度降低。', 'reference': 'page_136'} {'question': '请问车辆的无线充电功能在哪些情况下可能无法正常工作？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_131'}\n",
      "\n",
      "{'question': '问题：车辆无线充电系统是否支持同时为多个设备充电？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_136'} {'question': '问题：车辆无线充电系统是否支持同时为多个设备充电？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_131'}\n",
      "\n",
      "{'question': '问题：LynkCo-Pilot系统在何种情况下会默认将跟车距离间隔设置为最远？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_182'} {'question': '问题：LynkCo-Pilot系统在何种情况下会默认将跟车距离间隔设置为最远？', 'answer': '根据给定的资料，LynkCo-Pilot系统在每次启动车辆时会默认将跟车距离间隔设置为最远。', 'reference': 'page_188'}\n",
      "\n",
      "{'question': '问题：如何确保在各种路况下都能保持安全的跟车距离？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_184'} {'question': '问题：如何确保在各种路况下都能保持安全的跟车距离？', 'answer': '根据给定的资料，自适应巡航系统（ACC）可以根据设定的目标车速和跟车距离，在0-150km/h的范围内确保周围环境无危险，并与其他车辆保持适当距离。当系统检测到前方车辆行驶速度低于目标车速时，车辆将自动减速以保持适当距离。当前方车辆加速或没有速度较慢的其他车辆时，系统将控制车辆自动恢复到目标车速。因此，通过使用自适应巡航系统，可以在各种路况下保持安全的跟车距离。', 'reference': 'page_175'}\n",
      "\n",
      "{'question': 'LynkCo-Pilot系统在哪些情况下会提醒驾驶员接管车辆？', 'answer': 'LynkCo-Pilot系统在出现故障时会提醒驾驶员接管车辆。', 'reference': 'page_188'} {'question': 'LynkCo-Pilot系统在哪些情况下会提醒驾驶员接管车辆？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_181'}\n",
      "\n",
      "{'question': '如何确保在使用高级智能驾驶辅助系统时保持安全距离？', 'answer': '确保在使用高级智能驾驶辅助系统时保持安全距离，您应该：\\n\\n1. 根据车速调整跟车距离间隔，不是固定距离，而是随车速变化而变化。\\n2. 在湿滑路面行驶时，选择更大的跟车距离间隔。\\n3. 始终有责任始终保持安全的距离和速度，并在必要时及时采取制动措施。', 'reference': 'page_190'} {'question': '如何确保在使用高级智能驾驶辅助系统时保持安全距离？', 'answer': '根据给定的资料，可以从以下内容中获得答案：\\n\\n- 设置适当的跟车距离间隔：资料中提到，要确保设置的跟车距离间隔合适，以避免发生意外情况时来不及反应。尽管没有明确说明应该设置多大的跟车距离间隔，但可以推断应该选择一个安全的距离。\\n\\n- 根据道路和天气条件选择合适的跟车距离：在湿滑的路面上行驶时，资料建议选择更大的跟车距离间隔。因此，在使用高级智能驾驶辅助系统时，要根据当前道路和天气条件选择适当的跟车距离。\\n\\n- 随时注意并采取制动措施：无论使用任何驾驶辅助系统，驾驶者始终有责任保持安全距离和速度，并在必要时采取制动措施。这意味着在使用高级智能驾驶辅助系统时，驾驶者需要随时注意前方情况，并在必要时主动采取制动措施。\\n\\n综上所述，使用高级智能驾驶辅助系统时，可以通过设置适当的跟车距离间隔，根据道路和天气条件选择合适的跟车距离，并随时注意并采取制动措施来保持安全距离。', 'reference': 'page_184'}\n",
      "\n",
      "{'question': '问题：如何确保在各种路况下都能保持安全的跟车距离？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_190'} {'question': '问题：如何确保在各种路况下都能保持安全的跟车距离？', 'answer': '根据给定的资料，自适应巡航系统（ACC）可以根据设定的目标车速和跟车距离，在0-150km/h的范围内确保周围环境无危险，并与其他车辆保持适当距离。当系统检测到前方车辆行驶速度低于目标车速时，车辆将自动减速以保持适当距离。当前方车辆加速或没有速度较慢的其他车辆时，系统将控制车辆自动恢复到目标车速。因此，通过使用自适应巡航系统，可以在各种路况下保持安全的跟车距离。', 'reference': 'page_175'}\n",
      "\n",
      "{'question': '问题：在什么情况下，LynkCo-Pilot的性能会下降或无法正常工作？', 'answer': '在车道线不可见的道路、分岔路口道路、有车辆印记（如轮胎印）的道路、原车道与新车道之间存在较大的偏差道路、坑洼、突起、起伏路面、施工道路、超宽和超窄的道路、车道线拐折的道路、弯道过小的道路（如：匝道、环山路等）、十字路口或岔路口、车辆经过限速标志或道路标志后开始显示限速值，保持一定距离后结束显示，以及当经过限速拍照时，系统会提前将限速信息显示给驾驶员的情况下，LynkCo-Pilot的性能会下降或无法正常工作。', 'reference': 'page_192'} {'question': '问题：在什么情况下，LynkCo-Pilot的性能会下降或无法正常工作？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_186'}\n",
      "\n",
      "{'question': '既然提到了驾驶辅助系统的传感器可能会受限，导致LynkCo-Pilot无法正常工作，那么一个无法回答的问题是：如果驾驶辅助系统的传感器完全失效，会发生什么情况？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_192'} {'question': '既然提到了驾驶辅助系统的传感器可能会受限，导致LynkCo-Pilot无法正常工作，那么一个无法回答的问题是：如果驾驶辅助系统的传感器完全失效，会发生什么情况？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_187'}\n",
      "\n",
      "{'question': '车道辅助系统的哪些情况下会显示绿色状态指示灯？', 'answer': '车道辅助系统在启用时会显示绿色状态指示灯。', 'reference': 'page_202'} {'question': '车道辅助系统的哪些情况下会显示绿色状态指示灯？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_206'}\n",
      "\n",
      "{'question': '车道辅助系统在哪些特定情况下会停止工作？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_202'} {'question': '车道辅助系统在哪些特定情况下会停止工作？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_205'}\n",
      "\n",
      "{'question': '车道辅助系统未检测到车道线时，应该如何操作以解决问题？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_206'} {'question': '车道辅助系统未检测到车道线时，应该如何操作以解决问题？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_202'}\n",
      "\n",
      "{'question': '紧急车道保持辅助系统（ELKA）在哪些情况下可能不会工作？', 'answer': '紧急车道保持辅助系统（ELKA）可能不会在以下情况下工作：\\n\\n1. 行驶在急弯路段或狭窄道路时。\\n2. 车辆正常行驶时开启转向指示灯或踩下制动踏板。\\n3. 当车身稳定控制系统处于故障、关闭状态或对车辆进行干预时。\\n4. 车道辅助系统无法应对所有交通、天气与道路条件下的各种状况，在以下情况下车道辅助系统可能无法正常工作：\\n   - 道路施工。\\n   - 路面状况较差。\\n   - 驾驶员主动干预。\\n   - 车辆与相邻车道对向来车存在碰撞风险。\\n   - 复杂道路标志线。\\n   - 车辆可能与路沿发生碰撞或有冲出道路的风险。\\n   - 恶劣天气导致能见度降低。\\n   - 车辆可能与相邻车道上的行人，自行车等发生碰撞风险。\\n5. 如果驾驶辅助系统传感器受限，可能会导致车道辅助系统无法正常使用。', 'reference': 'page_208'} {'question': '紧急车道保持辅助系统（ELKA）在哪些情况下可能不会工作？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_204'}\n",
      "\n",
      "{'question': '紧急车道保持辅助系统（ELKA）在哪些特殊情况下可能无法正常工作？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_208'} {'question': '紧急车道保持辅助系统（ELKA）在哪些特殊情况下可能无法正常工作？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_201'}\n",
      "\n",
      "{'question': '泊车辅助系统在哪些情况下可能无法正确识别障碍物？', 'answer': '泊车辅助系统可能无法在以下情况下正确识别障碍物：\\n\\n1. 当泊车辅助雷达受到尘土、雪或冰的阻塞时。\\n2. 如果泊车辅助雷达的视野范围内有物体（例如：胶带、贴花等）遮挡。\\n3. 泊车辅助摄像头的视野有限，需要注意观察周围环境。\\n4. 当车辆上下陡坡时，泊车辅助系统可能会误报。\\n5. 泊车辅助雷达无法检测到离地面较高（大约处于1.5m以上）的障碍物。\\n6. 雨天时，泊车辅助摄像头表面可能会被水覆盖，导致影像失真。\\n7. 泊车辅助雷达可能无法及时对动物、小型车辆（如三轮车）、外表不规则车辆、骑行者、横穿或迎面而来的移动物体（行人、车辆等）或车辆侧面的物体做出反应。\\n8. 泊车辅助雷达无法检测到用特定材料制成的物体或人们穿着的由特定面料做成的衣服。\\n9. 受泊车辅助摄像头安装位置影响，当车辆以非直线行驶时，处于行驶方向的车轮轨迹外的障碍物可能无法被探测到。\\n10. 某些场景会对泊车辅助摄像头的探测造成影响（如有防护栏的道路、隧道内、前方车辆驶入/驶出、急转弯道路等）。\\n11. 强烈的阳光、反光、光线较暗的场景下可能会使您难以看到视觉警告信号，也可能影响泊车辅助摄像头的探测功能。\\n12. 泊车辅助雷达无法检测到地面上较平的物体、保险杠下的物体、离车辆太近或太远的物体。\\n13. 泊车辅助摄像头的设计意图是在驻车时提供辅助。但是，泊车辅助摄像头并不能替代您的注意力和判断力。\\n14. 倒车前，若您发现儿童或物体从后摄像头视图突然消失，请重新检查。该儿童或物体可能已经进入了泊车辅助摄像头的盲点。\\n15. 泊车时注意四周，包括可能进入车道的人或物体。\\n16. 当车辆受到撞击或强烈振动时泊车辅助雷达的位置可能会产生偏移，从而导致系统性能下降，严重时系统会有故障提示，若存在异常情况，请立即联系Lynk&Co领克中心。', 'reference': 'page_220'} {'question': '泊车辅助系统在哪些情况下可能无法正确识别障碍物？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_229'}\n",
      "\n",
      "{'question': '问题：RPA功能在哪些情况下会失效？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_232'} {'question': '问题：RPA功能在哪些情况下会失效？', 'answer': 'RPA功能在以下情况下可能会失效：\\n- 使用RPA功能前，车辆附近有人员或障碍物。\\n- RPA功能激活前，车门、尾门、前舱盖未关闭。\\n- 方向盘没有回正。\\n- 蓝牙信号不稳定。\\n- 在有坡度、积雪、积水、凹坑等道路上使用RPA功能。\\n- 使用RPA功能时松开前进或后退按键存在时延，可能导致车辆仍会运动一段距离。\\n- 外后视镜倒车自动调节时，可能出现延迟发出警告信息或不必要警告信息。\\n- 泊车辅助摄像头和泊车辅助传感器有覆盖物或脏污。\\n- 在雨雪天气下受到强光直射。\\n- RPA功能只适用于车辆周围环境可预测的停车场或车库。\\n- RPA功能的性能取决于探测到的障碍物、车辆、人或其他物体与车辆的距离接近程度。', 'reference': 'page_236'}\n",
      "\n",
      "{'question': '请问：泊车指的是什么？', 'answer': '泊车指的是将车辆停放在适当的位置，通常是为了暂时或长时间存放车辆而使用的一种驾驶技术。', 'reference': 'page_238'} {'question': '请问：泊车指的是什么？', 'answer': '泊车指的是将车辆停放在停车位或指定的停车区域的操作。', 'reference': 'page_226'}\n",
      "\n",
      "{'question': '请问在泊车过程中，车辆应该保持怎样的速度和姿势才能确保安全？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_238'} {'question': '请问在泊车过程中，车辆应该保持怎样的速度和姿势才能确保安全？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_175'}\n",
      "\n",
      "{'question': '请问在空调操作中，如果指示灯不亮起，应该如何排查问题？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_242'} {'question': '请问在空调操作中，如果指示灯不亮起，应该如何排查问题？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_256'}\n",
      "\n",
      "{'question': '空调的制冷量是多少？', 'answer': '258', 'reference': 'page_258'} {'question': '空调的制冷量是多少？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_281'}\n",
      "\n",
      "{'question': '请问空调的制冷量是如何与汽车性能和燃油效率相匹配的？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_258'} {'question': '请问空调的制冷量是如何与汽车性能和燃油效率相匹配的？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_245'}\n",
      "\n",
      "{'question': 'Lynk&Co App拥有多少用户？', 'answer': 'Lynk&Co App拥有284万用户。', 'reference': 'page_284'} {'question': 'Lynk&Co App拥有多少用户？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_279'}\n",
      "\n",
      "{'question': 'Lynk&Co 是一款什么样的汽车品牌？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_284'} {'question': 'Lynk&Co 是一款什么样的汽车品牌？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_331'}\n",
      "\n",
      "{'question': '问题：在充电过程中，哪些因素可能导致充电时间变长？', 'answer': '充电时间可能因以下因素而变长：\\n\\n1. 充电限值：当电池充电达到设定的充电限值时，将停止充电，待电池放电至一定程度后，才会继续充电。\\n2. 车外温度：在气温过高或过低的情况下，部分充电电流被用于升高或降低动力电池和乘客舱的温度，这会消耗一部分充电电流，从而延长充电时间。\\n3. 电池已使用时间：电池使用时间越长，电池性能可能会有所下降，这可能会影响充电速度。\\n4. 充电电流：充电电流的大小直接影响充电速度，如果充电电流较小，则充电时间会相应变长。', 'reference': 'page_296'} {'question': '问题：在充电过程中，哪些因素可能导致充电时间变长？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_293'}\n",
      "\n",
      "{'question': '请问如何确保在使用预约充电功能时，车辆能够成功连接到车载充电设备或充电桩进行充电？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_298'} {'question': '请问如何确保在使用预约充电功能时，车辆能够成功连接到车载充电设备或充电桩进行充电？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_295'}\n",
      "\n",
      "{'question': '高压系统的额定工作压力是多少？', 'answer': '300 bar', 'reference': 'page_300'} {'question': '高压系统的额定工作压力是多少？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_287'}\n",
      "\n",
      "{'question': '高压系统的额定压力是多少？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_300'} {'question': '高压系统的额定压力是多少？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_287'}\n",
      "\n",
      "{'question': '在保养和维护过程中，需要注意哪些安全警告？', 'answer': '在保养和维护过程中，需要注意以下安全警告：\\n\\n1. 在前机舱进行任何操作前，必须关闭车辆电源。\\n2. 关闭前机舱盖前，请确保前机舱盖关闭区域无障碍物，且发动机舱内未遗留手套、抹布或其他任何易燃物。\\n3. 驾车前，确保前机舱盖完全关闭锁止。\\n4. 缓慢降低前机舱盖，直至前机舱盖接触到闩锁。请勿单手或猛力关闭前机舱盖。\\n5. 将双手按压前机舱盖图示位置，双手向下按压直至上锁，关闭前机舱盖。请勿按压前机舱盖前部边缘或让前机舱盖自由落下。', 'reference': 'page_308'} {'question': '在保养和维护过程中，需要注意哪些安全警告？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_304'}\n",
      "\n",
      "{'question': '如何正确地进行汽车保养和维护以延长汽车使用寿命？', 'answer': '正确地进行汽车保养和维护以延长汽车使用寿命，需要遵循以下几个基本原则：\\n\\n1. 定期检查：按照制造商推荐的保养计划，定期进行车辆检查，包括发动机、刹车系统、悬挂系统、轮胎、灯光等关键部件。\\n\\n2. 更换机油和机滤器：定期更换机油和机滤器可以保护发动机，避免磨损和污染。\\n\\n3. 轮胎保养：保持轮胎适当的气压，定期轮胎平衡和轮胎四轮定位，可以延长轮胎的使用寿命并确保行车安全。\\n\\n4. 电池维护：定期检查电池的状态，清洁电池接线和端子，可以防止电池老化。\\n\\n5. 清洁和涂层保护：定期清洗车身内饰和外观，使用保护性涂层如打蜡或镀膜，可以保护漆面光泽，减少腐蚀。\\n\\n6. 防止过载：避免车辆超载，过重的车辆会对发动机和轮胎造成不必要的压力。\\n\\n7. 安全系统检查：定期检查安全系统，如刹车片、刹车盘、ABS泵等，确保其工作正常。\\n\\n8. 避免极端驾驶：避免高速行驶、急加速、急刹车和急转弯，这些极端驾驶习惯会加速车辆磨损。\\n\\n9. 及时解决问题：一旦发现车辆有异常情况，如异常噪音、抖动、油耗增加等，应立即检查并及时解决问题。\\n\\n通过以上这些方法，可以有效地进行汽车保养和维护，从而延长汽车的使用寿命。', 'reference': 'page_322'} {'question': '如何正确地进行汽车保养和维护以延长汽车使用寿命？', 'answer': '根据给定的资料，正确进行汽车保养和维护以延长汽车使用寿命的方法如下：\\n- 在最初的2000km行驶期间，遵守以下事项：请勿在空挡下高速空转发动机，避免在启动及任何挡位踩尽油门加速，发动机转速不应超过3000rpm，避免车辆长时间满载情况下低速或超高速行驶，尽量避免行车时急刹车，选择平坦路面行驶，避免在泥泞路或沙土路上行驶，避免以固定的车速或发动机转速长时间行驶。\\n- 定期更换保险丝，保护车内电气部件和电路，以避免电路短路或过载。\\n- 经常检查和保持发动机舱内的保险丝盒的干净和干燥，防止其受污染和受潮，以避免损坏电气部件和系统。\\n\\n以上是根据给定的资料中提到的有关汽车保养和维护的建议提供的回答。', 'reference': 'page_306'}\n",
      "\n",
      "{'question': '在紧急情况下，如何正确解锁并打开车辆的充电盖进行充电？', 'answer': '在紧急情况下，请按照以下步骤正确解锁并打开车辆的充电盖进行充电：\\n\\n1. 长按仪表板上的按钮以解锁充电盖。\\n2. 参考电子版用户手册中的车载充电设备充电章节，了解具体的充电步骤。\\n3. 检查并确认跨接电缆和充电端子已紧固连接，防止出现火花。\\n4. 开始充电时，先拆除负极端子和黑色跨接电缆，然后拆除正极端子和红色跨接电缆。\\n5. 先启动救援车辆，在不踩制动踏板的状态下，短按启动按钮使车辆进入点火模式I，然后长按启动按钮使车辆进入点火模式II，系统在几秒钟内完成自检。\\n\\n请严格遵守以上操作步骤，并注意安全警告，如避免接触低压蓄电池液，处理过低压蓄电池后请清洗双手等。', 'reference': 'page_344'} {'question': '在紧急情况下，如何正确解锁并打开车辆的充电盖进行充电？', 'answer': '按照资料提供的步骤，正确解锁并打开车辆的充电盖进行充电的步骤如下：\\n1. 长按仪表板上的按钮，解锁充电盖。\\n2. 打开充电盖，并取下充电插座保护盖。\\n3. 将三脚插头插入家用220V电源插座上。\\n4. 按住充电枪上的按钮，将充电枪完全插入车辆充电插座后松开按钮，充电枪被锁止后，车辆开始自动充电。', 'reference': 'page_289'}\n",
      "\n",
      "{'question': '请问在汽车技术中，1牛米（Nm）的力矩等于多少牛顿（N）乘以米（m）？', 'answer': '结合给定的资料，无法回答问题。', 'reference': 'page_354'} {'question': '请问在汽车技术中，1牛米（Nm）的力矩等于多少牛顿（N）乘以米（m）？', 'answer': '在汽车技术中，1牛米（Nm）的力矩等于1牛顿（N）乘以1米（m）。', 'reference': 'page_349'}\n",
      "\n"
     ]
    }
   ],
   "source": [
    "for x, y in zip(label, pred):\n",
    "    if y['reference'] in x['reference']:\n",
    "        continue\n",
    "\n",
    "    if np.abs(\n",
    "        np.array(\n",
    "            [int(xx.replace('page_', '')) for xx in x['reference'].split(' ')]\n",
    "        ) - int(y['reference'].replace('page_', ''))).max() > 2:\n",
    "        print(x, y)\n",
    "        print('')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "67277c8f-f5f9-4fa1-ba39-ee2827c42d06",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'question': '“前排座椅通风”的相关内容在第几页？',\n",
       " 'answer': '结合给定的资料，无法回答问题。',\n",
       " 'reference': 'page_116'}"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pred[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "5674692d-26a1-4392-8bfb-0e768dc1b7e9",
   "metadata": {},
   "outputs": [],
   "source": [
    "lines = open('[English (auto-generated)] Large Language Models in Five Formulas [DownSub.com].txt').readlines()\n",
    "lines = [x for x in lines if len(x) > 1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "6c786c27-52c5-48ea-9eed-eaf9ae15d952",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "大家好，我今天稍微有点不同。通常，我会谈论新的研究主题，我会引用很多资料，并且深入到非常硬核的技术细节中。今天，我要做一些稍微不同的事情，我要做一个关于大型语言模型的教程，它叫做“五个公式了解大型语言模型”。这个教程会比较随意，我会尝试给你们一些关于大型语言模型是如何工作的直觉。我会通过介绍五个核心公式来做到这一点，这些公式帮助我理解语言模型的一般原理。所以，不言而喻，这个时候你已经听说过语言模型，听说过大型语言模型，听说过在设备上的语言模型，听说过解决数学问题等等。\n",
      "生成代码，基本上我可以在聊天GPT中输入任何荒谬的事情，并得到一个相当连贯的答案。例如，我正在请求写一个微积分问题，就像理发师给我剪头发一样。坦率地说，它做得相对不错。但对于这个话题，我并没有太多更多的要说的。相反，我想聚焦于关于更大语言模型推理的问题。我的目标是开发一种语言，让我可以推理大语言模型是如何工作的。这个问题在于，我们甚至还没有真正理解小型语言模型是如何工作的。我内心并不是一个乐观主义者，所以我不打算告诉你我们很快就会弄明白。然而，我可以告诉你，在某些具体领域，我们可以推理其行为。\n",
      "大型语言模型相当精确，因此，以此作为一个统一主题，教程结构是讨论\n",
      "五个公式的大型语言模型现在我不会让你悬而未决，我会告诉你我选择的五个特定的\n",
      "我会有关联度、关注、小猎犬和松鸡的部分现在，如果你以前没见过这些，这些会\n",
      "是很神秘的名字，如果你需要帮助，这些对应于生成、记忆、效率、扩展和推理\n",
      "在我们开始之前，还有一个注意事项我会集中于概念理解\n",
      "所以我将简化很多细节，很可能出错\n",
      "你应该将这视为在某种无摩擦的环境中行事，这是一种理想化的版本\n",
      "语言建模更关注于理解如何思考系统，而不是具体的细节。好的，让我们开始吧。第一部分是关于生成的，我们将专注于困惑度的公式。在这一部分，我们将使用简化版的语言。我们假设拥有一组文档，每个文档恰好由一千个词素组成。我们还将使用简化版的语言，这个版本的语言将包含10,000个词素。将其视为我们的词典。我们定义一个语言模型为文档的概率模型，它给出了词素X1到XT的概率，并使用一组参数Theta。我喜欢这种表示方法。\n",
      "因为它允许我们将参数Theta与概率模型隔离，考虑到Theta将是一个大型神经网络，这使我们可以将定义该网络的问题推迟到讲话的下一部分。考虑到文档的概率是词标记的联合概率，我们可以利用概率的标准规则来编写分布，然而我们通常希望以一种常见的方式来写，即将其分解为其条件的乘积。我们通过从左到右分解它，将其表示为X1, X2的条件概率，依此类推，直到我们得到整个概率分布。一旦我们这样做，我们就可以参数化个别条件概率，特别是我们形成所谓的自回归模型。\n",
      "语言模型这是一个预测模型，我们预测下一个标记，基于之前的标记。我们称它为自动回归模型。自动回归是指我们回馈之前的预测，回归是指我们更具体地预测下一个标记。我们可以将这些条件概率视为产生一个10000种不同选择的分布，即我们为词典中的每个词分配一个概率。我将用一个柱状图表示所有可能的下一个词选择。这个联合分布的一个好处是，我们可以通过单独采样每个词来生成一个文档。以下是一个例子，我们采样词X1到XT。\n",
      "仅仅是逐个采样的单词，将其作为条件输入到下一步，然后采样下一个词标记，这使得它更加具体，为什么我们有自动回归过程。好吧，我们已经进行了大约5分钟，老实说，我还没有告诉你任何新东西。事实上，我到目前为止所说的几乎所有内容都是马可夫大约100年前就已经发现的。这是一个相当古老的想法，但掌握基础知识是很重要的。说到这里，这确实允许我们讨论一些人们在语言建模中曾经做出的假设，这些假设在现代系统中已经不再成立。第一个假设是语言模型具有一定数量的历史。特别是，直到最近，通常假设语言模型的历史是固定的。\n",
      "XT 的概率实际上只取决于前面的一些单词，例如，我们可以假设 XT 只依赖于 XT 减一。这看起来像是一个过于激进的假设，但是 XT 减一确实为预测 XT 提供了最多的信息，而距离更远的单词提供的信息则逐渐减少。我将提到的第二个假设称为分类假设，这个假设是下一单词的概率可以用分类分布大致建模。当人们开始使用神经网络来模拟下一单词预测的概率时，这个假设就消失了。在 1948 年的先驱性工作中，香农（Shannon）开发了一些最早的语言模型，他实际上产生了一个一步分类语言模型并进行抽样。\n",
      "从我们在之前的讨论中看到的方式来看，这个模型实际上与许多在神经网络现代复兴之前开发的语言模型并没有太大的不同，当然香农的模型并不出色。但由于语言建模在某种意义上是一种无监督学习，因此很难量化一个模型的好坏。为此，我们基本上需要给它提供未见过的文本，然后检查它的预测与该文本中的预测有多接近。我们需要以某种方式计算这个值的度量，并使用它来比较不同的语言模型。因此，你可能尝试的最简单方法就是简单地检查给定句子（如“狗走到空白处”）时语言模型的准确性。我们可以看看我们模型的……\n",
      "我们将分布进行比较，在这个案例中，我们本应预测“lawn”，而真实答案是“lawn”，这意味着我们从一分中得到了零分，我想这是对的，但有些令人不满意。我们相当接近，我们几乎得到了正确答案，但我们得到了零分。这个问题metric 由于一个事实而变得更加复杂，即单词和语言遵循所谓的zipfian分布。这意味着非常非常常见的单词占据了非常大的概率质量，但是非常不常见的单词出现的频率却相当高。这个问题之所以困难，是因为不是每个预测都是平等的，很多时候我们都会预测像“the”或“a”这样相对常见的单词，但不会太频繁地预测不常见的单词。\n",
      "我们必须预测像“披萨”或“雨衣”这样的非常具有挑战性的单词，以激励实际应用中的系统。让我们考虑将概率分布转换为每个可能单词的二进制值字符串。这个转换可以确定性地完成，但你可以把它看作是在每个单词上放置一个“B”。你只有这么多的值可以分配，所以你必须利用概率来选择为每个单词放置的字符串长度。所以在这次的例子中，也许我们在单词“part”上放置了一个短字符串“101”，而在单词“lawn”上放置了一个稍微长一点的字符串“100101”。那些完全无关的单词可能会有非常非常长的强度，但总体来说，我们有一个二进制数对于每个我们预测的可能单词。\n",
      "可以证明这些字符串的最优长度大致为负的二进制对数，即直方图中解释概率的负对数。这就是为什么概率非常低的单词会有非常长的字符串的原因，而且概率越接近1，字符串越短。这不仅仅是一个理论上的转换，这些字符串实际上为我们提供了一种压缩底层语言的方法，并将它传达给拥有我们语言模型的一方。概率与比特之间的这种转换为我们提供了语言建模中使用的的主要度量，称为困惑度。由于历史原因，困惑度被定义为2的平均每个词的比特数在我们的保留测试集中。可以用下面的公式计算，其中我们简单地\n",
      "计算每个真实下一个单词的概率，取以2为底的对数，求平均值并取相反数，然后乘以2的幂。这样它就变成了用户在使用语言模型时稍为容易处理的形式。为了使你信服，让我们先来看一些例子。首先，让我们考虑一下，如果我们的困惑度是1，这意味着每个单词所需的位数实际上是零，这怎么可能呢？难道我们不需要传达有关下一个单词的信息吗？但在这种情况下，我们实际上真的不需要。如果我们的困惑度是1，我们正在交谈的人基本上已经知道下一个单词是什么，它总是概率最高的那个。我们实际上不需要传达任何信息。另一种情况是，让我们假设我们的困惑度是10,000，这暗示我们需要\n",
      "一个大小为2的10,000次方到2的对数的字符串，来传达我们字典中的任何单词，这意味着我们从语言建模中并没有真正得到任何优势。这暗示着我们的模型基本上是均匀的，如果我们试图猜测下一个单词，我们基本上需要掷一个10,000面的骰子。我还要指出，我们的困惑度可能大于10,000。特别是，如果我们的模型对于错误的预测过于自信，它可能会将下一个单词分配一个非常短的代码，而将正确的下一个单词分配一个非常长的代码。这将导致一个非常糟糕的困惑度值，因为我们将花费大量的位来传达我们认为永远不会实际发生的下一个单词。长期以来，人们研究了\n",
      "使用名为《华尔街日报》语料库的语言建模问题\n",
      "你可以将这想象为使用几年的报纸文章作为你的训练数据，然后尝试评估你在今天的报纸上的困惑度。如果你用均匀分布来做这件事，你的困惑度大约是10,000。如果你让自己看到上一个词，你可以降到大约600。如果你可以看到前两个词，你可以接近降到200。如果你给自己提供前四个词，以及大约40年的巧妙技巧，你可以降到大约140。当深度学习开始关注语言建模问题时，早期Markoff神经网络达到了类似的性能，大约也是140。当人们开始使用神经网络来解决语言建模的问题时，取得了突破性的进展。\n",
      "开始发展早期的非自回归（non-m）马尔可夫神经网络，它们能够观察到更长的范围，可以降至大约100甚至更低。这极大地简化了非常丰富且有趣的文献，但它给你一个大致的关于2015年左右这个领域大致处于什么位置的印象。但为什么人们在2015年真的关心这个问题呢？答案之一是因为语言建模是一个很好的代理，可以直接用于我们关心的其他任务，例如机器翻译任务，例如将法语句子翻译成英语，可以表述为一个条件语言建模问题，而不仅仅是基于之前的单词进行条件化。你也可以基于整个法语句子进行条件化。然后，你可以衡量。\n",
      "在生成英语单词的条件困惑度方面，基于Fred输入的研究发现，衡量这些系统中的困惑度与实际的下游性能非常强烈地相关。因此，在这张表中，我们有一组不同的困惑度值，用于翻译实验，并且我们有相应的翻译准确性，这是通过一种名为blue score的自定义测量方法来测量的。研究发现，随着困惑度的降低，这个任务上的blue score会变得更好。然而，如果仅此而已，除了自然语言处理（NLP）领域之外，很少有人会关心。接下来人们发现的主要结果是，在语言建模任务本身的困惑度可以用来产生真正好的模型。\n",
      "在模型从未见过或仅见过几个例子的任务上，这个表格展示了一个有趣的结果，仅仅是原始的语言建模，复杂度就从5.84降低到了3.23，在同一系列的实验中，同时还有三个其他非常不同的下游任务都有了显著的提高。这些任务并没有包括在原始的训练数据中，而是后来提供了一小组例子。仅仅通过降低通用语言的复杂度，这个模型就可以用于这些任务。这个想法现在当然成为了所有现代大型语言模型研究的基础，实际上，在现代的论文中，比如llama 2，他们有时真的只是展示了复杂度，人们相信事情会运作。\n",
      "这个表格很好地展示了这样一个事实：四个不同大小的Lamama 2模型\n",
      "每个都有更好的困惑度。我们从大约1.8的最终困惑度\n",
      "降到大约1.5。最下面的模型Llama 2 700亿\n",
      "仍然是最好的开源大型语言模型之一，我们可以相信\n",
      "这是因为它有极其好的通用困惑度，如我们之前所见\n",
      "1.5的复杂度意味着模型真正地捕捉到了英语的分布\n",
      "而且，虽然这并不是一个完全公平的比较，我们可以\n",
      "回顾并应用GPT 3到具有挑战性的《华尔街日报》测试\n",
      "语料库中，你得到一个20.5的困惑度，比一些\n",
      "较早的语言模型应用于此任务有了显著的飞跃，但我有点\n",
      "跑题了。\n",
      "我还没有告诉你如何从香农模型实际上过渡到GPT3，为了做到这一点，我们需要去除两个主要假设。我们首先将需要转向使用神经网络，然后我们需要弄清楚我们如何能够考虑所有之前的词袋。这把我们带到了第二部分，它专注于记忆，特别是注意力的使用。对于这一部分，我们将深入研究Theta。我们将尝试更好地理解如何创建一个可以驱动预测下一个词的概率模型的神经网络。为此，让我们回到我们的马尔可夫假设，并假设我们只考虑最后两个先前的词，但使神经网络能够预测下一个词。\n",
      "为了实现这一目标，我们将采用以下函数形式，并在XT减2和XT减1上运行一个神经网络，这将会生成一个向量，然后将其发送到softmax函数。softmax函数会将这个向量转换为一个包含10,000个可能类别的分布。这个分布将表示我们的语言模型分布，并告诉我们我们认为接下来会出现哪些单词。嗯，弄明白使用哪种最佳的神经网络花了一些时间，回顾起来，这些网络的形式相对简单。我们将将xt-2和XT减1编码为独热向量，也就是说，这些向量在每个位置上都是零，只在代表他们的单词标记的位置上是1。然后，将这两个向量输入到一个神经网络中。\n",
      "神经网络将以标准形式处理这些数据，并输出另一个大小为10,000的向量。我们在语言上学习整个东西，总的来说，这可能大约是五到十行Pytorch代码。在神经网络处理之后，我们必须将输出转化为我们的词汇表上的分布。这是通过应用softmax函数来实现的，该函数确保输出为正数且求和为1。我们通过将向量中的每个元素取指数然后归一化来实现这一点，这会产生一个如第一节中我们所见的历史ogram。显然，我对这个过程相当随意，但实际上，有很多早期神经网络语言模型，它们都有创新，使达到这一步成为可能。特别著名的一个是……\n",
      "这个模型被称之为word toac，它正好是在10年前出现的，展示了许多后来成为基础的技术。有一点值得注意的是，在当时建造这样的模型要难得多，特别是因为计算基础设施和硬件还没有得到很好的发展。然而，一旦你有了语言模型的基础设施，你就可以加入更多的数据，开始构建更大的网络。特别是，你可以拿到的这些基于Marvian神经网络模型的基础设施，简单地将内部替换成一个更大的神经网络。然而，这本身似乎还不够。其中的一个问题在于，尽管后续的词汇是特别\n",
      "重要的是，有许多部分在没有查看更长时间上下文的情况下很难恢复，所以特别是，即使你有一个非常大的神经网络，你也许在最后两个词汇中不一定有足够的信息来真正准确预测下一个出现的词汇。为了使这一点更具体，让我们来看一下我们的例子。如果我们试图预测“狗散步到公园”这个句子中的下一个词，而我们只允许自己使用最后两个词，我们会陷入必须仅从“到”和“公园”这两个词中预测空格词的困境。这告诉我们这个词是一个地点名词，但它实际上并没有告诉我们关于句子本身语义的太多信息。我们不知道谁在去，也不知道动词是什么，而这些信息实际上可以帮助我们更好地预测。\n",
      "在这个预测问题中的一些较难的部分，一种著名的语言建模问题示例是，存在一个专有名词将要填充一个槽位，但这个专有名词在文档中提到的时间要早得多。例如，假设你读一篇新闻文章，你在引言段落中提到了一个人的名字，后来你可能需要再次提及同一个人，并回忆起他们的姓。从理论上讲，这种情况相对较少，通常你只需要说出一些专有名词就可以得到简单的部分。然而，要获取那个人的确切身份的较难部分，需要非常长期记忆。这些以及类似的例子确实促使使用完全自动回归模型。这些模型具有利用所有之前的\n",
      "令牌明显这是一个相当简单的想法，并且已经尝试过这个想法的许多不同模型。我们将重点关注一种称为“注意力”的方法的一个特定应用，使我们能够构建完全自回归的长距离模型。你可能首先会问，为什么一个简单的神经网络不能做到这一点？我们不能只是取我们看到的前面的马尔可夫神经网络语言模型，并使其更长吗？问题是，如果你这样做，你最终会学习关于绝对定位的非常具体的信息，例如，你可能会了解到关于位置7的一些特定信息。但是语言并不是真正的工作方式，关于位置7并没有真正具体的信息，它会去。\n",
      "依赖上下文和动态结构，在文档中构建的内容会根据需要关注特定的一部分解决方案。这个解决方案位于所有现代大型语言模型的核心，它是一个被称为“注意力”的概念。要理解注意力，可以想象它是神经网络的随机存取存储器，或者更简单地说，是神经网络的查找表版本。我们会保存所有先前的信息，然后在需要时回溯。例如，让我们回到我们的简单句子，“狗走到_处”。为了预测下一个单词，我们希望利用这个历史信息。为此，我们需要三种不同的信息：我们将有一个被称为查询的向量，它具有\n",
      "到目前为止查看了整个句子。另外，我们还将有一个查找表，其中为每个之前的职位都有一个键和一个值。基于查询，我们将匹配我们认为与下一个词预测最相关的键。从那个键中，我们将提取相应的值，这个值随后将被传递给一个神经网络，我们可以利用它来预测我们序列中的下一个词。这个过程分为几个步骤：查询匹配键的最佳匹配被选中，然后我们返回该键的值。然而，这个过程存在一个基础问题。问题在于，我们希望整个过程能够嵌入到神经网络中，而神经网络是通过使用导数来学习的。问题在于，我们会使用argmax操作来确定最可能的值，而argmax操作不能直接在神经网络中实现。\n",
      "选择最佳的键是否有用呢？如果我们将其写成单维度函数，我们会发现得到一个导数为零的平坦结构，这并不是我们想要的。我们需要另一个函数，使我们能够逐渐选择想要使用的键。常见的方法是将artmax函数简单地替换为我们之前见过的softmax函数。这个softmax函数不是产生针对工作词类型的分布，而是产生针对先前标记位置的分布。这个分布是通过平滑计算得到的，在每一个位置都有非平凡的导数。在二维空间中，这个softmax函数可以绘制成sigmoid形状，它在每一个位置都有很好的导数。所以，这是我们新过程的步骤一，我们使用sigmoid形状的函数。\n",
      "在评分我们的键时，我们不是选择得分最高的值，而是使用softmax函数来归一化分数。在第三步中，我们不是产生一个单一值，而是利用softmax函数来平均不同值，通过它们键与查询的匹配程度来进行加权。以下是实际操作中的情况：我们首先使用相同的查询键和值，然后将查询与键匹配以获得每个位置的分数，并计算softmax，这给我们提供了一个关于这些键位置的直方图。我们然后使用这个直方图来平均值，这产生了一个新的向量，它是通过直方图加权不同值的一些平均值。最后一步与前面完全相同，我们不使用\n",
      "当我们使用单一值时，我们用加权值来预测下一个词。这个过程是 fully differentiable（完全可微分的），是一种很好的学习能够决定哪些前文词汇对下一个预测有用的神经网络的方法。这个称为“注意力”的操作是语言建模领域关键工作的核心，该论文于2017年发表，引入了一种名为Transformer的神经网络架构，该架构严重依赖这一注意力步骤。除了我之前展示的简单版本之外，还有许多扩展，但大致思路是一样的：您有一种计算键（Keys）、查询（queries）和值（values）的方法，然后您反复使用注意力，直到准备好预测下一个词。这使我们的语言模型参数化，并生成了一个很好的神经网络。\n",
      "预测下一个词的分布\n",
      "Transformer架构的图表已经成为该领域的一个标志性图像它大致由两个阶段组成第一个阶段是我们刚才看到过的注意力第二个阶段是一个相当大的标准神经网络这两个阶段在最终预测做出之前会重复多次这个图表看起来有点复杂但请注意这基本上描述了整个GPT系统鉴于它作为一个大型语言模型的重要性实际上它非常简单我已经告诉了你什么是注意力但还没有告诉你为什么它是处理这类长形式语言模型的最佳方式一个诱惑性的答案是说注意力有点像记忆所以这样做是有意义的\n",
      "实际上在实践中，哪种架构会胜出，真正的答案却有点不同。结果表明，Transformer架构中使用的这种注意力机制碰巧非常高效且可并行处理。它是一种长距离依赖和在某现代硬件上运行迅速的好组合。为了使这一点更清晰，请允许我指出，在实践中，我们实际上将同时计算多个查询。这些查询可以组合成一个矩阵，就像具有键和值存储的内存也可以写成两个分开的矩阵一样。当我们结合查询和密钥并计算软磁盘时，我们最终得到许多不同的直方图，代表所有查询组合。\n",
      "这一组直方图的键可以通过运行softmax函数来计算，该函数基于查询和键之间的矩阵乘积。类似地，这些键可以与值矩阵相结合，通过计算查询和键的softmax与值矩阵之间的矩阵乘积，从而得到加权平均集合。这个过程简单地说就是计算每个值输出的es，然后用来预测下一个词。这个过程中的亮点是，整个注意力步骤可以写成两个矩阵乘法，其中一个softmax围绕内部的乘法。回到我们的三个步骤，我们只需要查看这个数学公式，就能看出查询通过矩阵乘法评分键，然后softmax对分数进行归一化，以产生\n",
      "直方图，然后计算加权平均值；\n",
      "再次计算矩阵乘法，整个过程就是一系列的soft Max和矩阵乘法。\n",
      "但这是否真的有效率呢？\n",
      "到目前为止，我们已经描述了一个完整的自回归语言模型，这个模型被称为生成型Transformer。\n",
      "但我还没有告诉你们的是，为什么这个模型在实际运行中如此之快。\n",
      "在下一部分，我们将深入研究这个矩阵乘法操作，并看看我们是如何让它在上GPU上运行得更快。\n",
      "第三部分：效率\n",
      "我一直徘徊在这个问题上，为什么语言模型突然变得如此之好，\n",
      "如果坦白说，答案其实很简单，主要是因为GPU。\n",
      "我可以给你展示一张GPU速度的图表\n",
      "在过去的几年里，但在某种意义上，向你们展示英伟达（NVIDIA）的股票价格图表，让我们在过去几年的同一个问题上有了一致的认识。在构建更大、更强大的大型语言模型的过程中，硬件的核心重要性日益凸显。作为一名深度学习从业者，通用编程在GPU上的兴起从根本上改变了可以构建的模型类型。正如我们之前所看到的，softmax函数在预测序列中的下一个词以及在注意力机制中的使用都至关重要。为了计算softmax函数，我们需要对分布进行归一化，这意味着要对词汇表中的每个词型求和。这个和是惊人的大，它可能超过10,000种不同的词型。\n",
      "如果我们考虑到语言模型,2010年左右,有很多研究致力于有效地近似softmax函数的分母。如果我们能够提出某种方法来有效地近似分母,我们就可以在CPU硬件上更有效地计算softmax。但是,随着GPU的引入和广泛使用,这一切都发生了变化。结果证明,在GPU上计算这个分母相当简单,突然之间,我们不再需要找出巧妙地近似这个函数的方法。一个类似的例子是矩阵乘法的计算。矩阵乘法是深度学习的每个部分的核心,它在神经网络本身中使用,我们也看到它是计算的核心。\n",
      "如果我们能将一个操作映射到某种矩阵乘法的形式，那么我们当然可以在新的GPU上快速运行它。我将用这个例子来教你一些关于GPU是如何工作的知识。首先，什么是GPU？在一种较高层次的近似中，你可以将GPU看作是一个并行计算机。GPU拥有许多线程，它们都同时运行相同的代码。为了使事情不那么令人畏惧，我们将把每个GPU线程想象成一个微型机器人。这个机器人可以执行数学运算，并且可以在GPU内部读写内存。在GPU中，每个这些线程都被组织成一个块。在这张图片中，我们可以看到一个GPU块，对于这个例子来说，它对应于12个不同的个体。\n",
      "每个线程都要运行相同的代码，但它们还可以从整个块都能访问的内存中读写。对这个内存的读写非常高效。最后，整个GPU由一个网格组成，这个网格包含我们之前看到的所有的块。网格中的每个线程还可以从一组全局内存中读取。这个全局内存被整个网格共享，但从中读写相对效率较低。GPU编程的主要规则是，我们只能在每个块中有限数量线程，但块将非常重要。块是必不可少的，因为从全局内存的读写速度远远慢于利用块内存。\n",
      "想要在块内尽可能多地执行操作，而不是诉诸全局内存。我认为到此为止你已经理解了主要思想，但让我们通过一些例子来巩固一下。如果每个线程都单独读写全局内存，那将是非常糟糕的，虽然你可以得到并行性，但计算速度会非常慢。在理想世界中，我们首先从全局内存加载到我们的本地块内存中，然后在其中进行一些计算，我们可能在局部内存中读写几次，然后当我们完成时，将最终答案写回到全局内存中。这是GPU编程的主要技巧，但这可能有点违反直觉。\n",
      "并且在实践中第一次看到它的应用可能会相当具有挑战性。为了使事情更加具体，让我们通过一个3x3矩阵乘法的例子来讲解。在这个例子中，我们将有两个方形矩阵A和B，这两个都将是我们将计算a b的每个元素，通过将a的列与B的行相乘，然后将结果相加。下面是计算第二行第一列的例子。首先，我们将a的第一列与B的第二行相乘，然后将结果相加。如果我们天真地做这个，我们会有一个线程计算AB中的每个输出。为了计算这个值，我们会有六次全局读取：a的列和B的行。每个线程都会做乘法，将它们相加，然后\n",
      "将其重新写回到全局内存中请注意，这样做每个线程需要六个全局读取。一个更好的方法是将首先从全局内存读取到块内存中，我们可以在块本身内计算重要的中间结果，然后最终写回到最终值。让我们看看在实际中这是如何工作的。在第一步中，我们从全局内存读取到块内存中，我们将通过读取整个矩阵到我们的块内存中，产生2 * 9个全局读取。一旦我们有了在我们块内存中的矩阵，我们就可以让每个线程执行我们之前看到的相同的操作，但现在读取是从共享内存而不是从全局内存进行的，这在实际中要快得多，因为内存是共享的，不同的线程可以重用。\n",
      "在计算输出矩阵的不同位置时，使用相同的行和列；\n",
      "当我们完成后，我们可以简单地将计算出的共享AB矩阵复制回全局内存，用于下一次操作。如果我们看看使用朴素方法的读取次数，每个线程进行了六次全局读取，总共有九个线程，总共产生了54次全局读取。如果我们使用基于块的方法，所有的读取都发生在第一个栈中，这产生了9*2=18次读取，这比每个线程的读取次数少得多，但这是整个矩阵适合我们块的情况。请回想一下，我提到块必须是一个固定大小，因此我们不能将这种方法扩展到任意大的矩阵。那么，你可能要问，如何处理一个6x6的矩阵乘法呢？\n",
      "在相同大小的块中，答案是您最终需要分多个步骤进行第一步，而不是一次性读取整个矩阵，我们每次读取A和B矩阵的3x3块，这样会产生2x9次对3x3块的读取。完成这些步骤后，我们可以通过将顶部矩阵的列的三个值和底部矩阵的行的三个值相乘来计算最终值的一部分。然后，我们使用单个线程从块内存中读取数据来计算单元格。当这部分完成后，我们将两个原始矩阵的新部分复制到共享内存中。对于顶部矩阵，我们处理底部部分，对于底部矩阵，我们处理右侧部分。然后，我们使用线程将这些组件相乘。\n",
      "将它们相加，得到最终值在第一部分和第二部分之间，\n",
      "在这个过程中，我们现在已经计算了最下面行的顶上面列的全面乘积，\n",
      "这为我们提供了3X3块在a * B矩阵中的正确答案，\n",
      "一旦完成，我们可以将我们的3x3块写回全局内存，\n",
      "这为我们提供了完整a乘以B输出矩阵的3X3部分，\n",
      "与此同时，其他块正在完成a * B矩阵的其余部分，\n",
      "每次这些块只执行2 * 9次读取，\n",
      "在这种情况下，每个块总共执行36次全局读取，\n",
      "以便计算完整的最终矩阵，\n",
      "这就是本节的主要操作，\n",
      "我本来应该简单地称之为矩阵乘法，实际上是这样的。\n",
      "当在GPU上应用时，这种操作通常被称为宝石。GPU操作使我们能够实现这种矩阵乘法的通用版本，同时还允许我们添加一个额外项并对操作进行缩放。但你明白这个意思，我们可以通过利用GPU的所有力量来执行这种低级别的有效矩阵乘法。如我之前提到的，低估这个操作对现代神经网络的重要性是非常非常困难的。它在系统的几乎所有主要部分中都被使用，特别是在计算注意力和用于Transformer的核心神经网络块方面，尤为重要。此外，我向您展示的只是现代GPU上矩阵乘法的基本形式，还有更多高级的形式存在。\n",
      "各种专业的硬件，在每次发布时都持续使矩阵乘法的计算速度变得更快，但您可能会想知道，为什么我们如此关注速度。难道不够快吗？你可以在你的笔记本上运行一个语言模型，这还不够好吗？为什么我们要如此激烈地优化它？你可能会想知道所有的计算都去了哪里，以及为什么人们争相购买最新的GPU。第四部分：扩展性。我们已经讨论过生成模型，也讨论过变压器（Transformers）。在本节中，我们将重点关注预训练（Pre-training）。特别是，我们将关注如何将这类语言模型扩展到可以处理大量数据，以及如何使用非常大的神经网络进行训练的问题。\n",
      "与这次谈话的其他部分不同，扩展过程中的关键决策似乎相当简单。我们必须决定使用多大型的神经网络，这意味着我们要在我们的神经网络层中尝试拟合多少参数。我们还必须决定使用多少训练数据，大致是多少文档或标记来训练我们的模型。在更多标记上训练模型可以使模型更好地拟合数据，并潜在地提高困惑度。这两个变量有趣的地方在于，它们之间存在乘法关系。如果我们取神经网络的大小，再取训练数据，那么我们为预训练所需的总体计算量将随着它们两个大小的乘积而增长。\n",
      "可以这样理解这个问题：每当我们认为一个token进入N网络，就需要接触这个神经网络的每一个参数，这就是形成乘法关系，并构成系统的总计算量。我们可以在三个著名的模型中看到这种关系。在2018年发布的BERT模型中，大约有1.09亿个参数，系统在2500亿个token上进行训练，这导致了大约1.6 x 10^20的计算量。当我们跳到2022年训练的PAL模型时，它有5400亿个参数，并在7800亿个token上进行训练，这导致了大约2.5 x 10^24的总计算量。因此，模型正在变得更大，它们在更多的数据上进行训练，更重要的是，它们越来越多地利用计算资源。\n",
      "如果我们能充分利用计算资源，我们就能获得更好的语言FS。所以，你可能会问，在这些变量中，我们想要改变哪个。在关于扩展定律的一篇论文中，Open AI的研究人员展示了对于这些每一个量，模型的困惑度（perplexity）将按幂律提高。这意味着，如果我们做一个对数对数图（log-log plot），将困惑度与每一个单独的幂次相对比，我们会得到一条直线，显示随着计算参数或数据量大比例增加，困惑度的降低。鉴于这种关系，一个自然的结论就是尽可能增加所有这些参数。它们似乎都能提高性能，所以我们不妨让它们尽可能大。然而，这个论点的问题是，即使\n",
      "你们拥有大量的GPU资源，你仍然有一个计算预算，你需要决定如何最好地利用可用的计算资源。例如，这两个图表都使用了大约相同的计算量或图表面积，但左边的图表更多地分配了计算资源来利用更多的标记进行训练，而右边的图表则将计算资源用于具有更多参数的模型。我们如何确定哪个最终会获得最佳的困惑度呢？实际上，这并不是一个理论问题。例如，我之前提到的pal模型使用了大量的参数，实际上相对较少的标记。你可能会问，这是他们能做的最好的事情吗，或者他们是否可以做得更好。\n",
      "我们将用来研究这个问题的方法是，写下功率墙的公式，然后尝试将这个公式与显示困惑度的经验曲线拟合。如果我们能够得到一个好的拟合，我们也许可以推导出如何训练一个新模型，基本上是判断我们应该使用更多的参数还是更多的令牌。这个公式看起来有点复杂，所以让我们画成一张图吧。公式告诉我们，我们的困惑度可以预测为某些值a除以我们使用的参数数量得到的α项加上一个第二项，即b除以我们使用的数据量得到的β项。我们随后再加上一个额外的e项，它作为偏差，对应于该语言可能达到的最佳困惑度。关键的感兴趣的术语是\n",
      "该内容翻译为中文，保留原始文本的含义如下：\n",
      "\n",
      "模型大小和数据大小上的指数将大致告诉我们如何缩放我们的模型。这个公式及其拟合结果在一份被称为“chinchillo”的论文中被探讨。Chinchillo的主要结果是，模型和数据的指数，即蓝色和绿色盒子大致相同，这暗示最佳困惑度可以通过一个均衡的比例缩放公式实现，即如果我们以大致相等的比例缩放数据和模型，我们就能用最少的计算资源获得最佳的困惑度。这个结果的后果是我们可以回过头去看看一些之前的模型。特别是，我们可以注意到，pal模型采用了偏好参数胜过数据的缩放方法，这或许是一个错误的选择，最终导致……\n",
      "在他们的模型A的最终困惑度和结果上花费了过多的计算资源。更好的策略应该是平等地扩展参数和数据，这样你最终得到的东西更像是一个正方形而不是一个矩形，这让你能够用更少的计算资源并获得通常更少的成本来获得一个非常好的模型。这项工作中的显著图表显示了一个图表，其中继续扩展计算能力，由图中的中间线条表示的flops表示。Gilla模型，我们看到了那些相等的扩展最终出现在这条线上，而其他模型，如GPT3或其他方法，如Megatron-LM，具有530个 billing参数最终过度参数化，因为它们使用的令牌数量。当然，这里有很多复杂性，以及其他\n",
      "因素，但总的来说，它为人们如何产生更好的模型提供了非常好的关键。在构建大型语言模型的许多对话中，围绕这个奇努拉缩放的理念以及如何利用各种约束。然而，这种缩放属性有几个非常重要的告诫，其中主要的一个是模型参数和训练数据之间的不对称性。训练数据只在训练过程中被利用，因此是一次性成本。然而，模型参数必须用于实际大型语言模型的每一次推理，所以每次你实际调用 Cat GPT 它都必须基本上使用模型的所有参数。由于这个原因，它实际上可能会更慢。\n",
      "在您的训练时间计算中，有益于利用一部分来生成一个更小型的模型，也许会使用更多的令牌。这可能导致一些奇怪的不对称现象，即人们生成的模型可能不是他们在特定约束下能够计算出的最佳模型，但最终可能会导致更好的实际应用。最著名的例子是原始的L模型。这个模型在训练计算方面故意不是最优的，但最终生成了一个参数比一些更大模型还要少的模型，而这些大模型的计算量相似。为了实现这一点，他们只是预先支付了更多的费用，在更多的令牌上训练它，然后分发较小版本的模型。简要概括一下，我们生成大型语言模型的关键方式就是通过这种方法。\n",
      "初始预训练阶段，尤其是当使用生成预训练的Transformer时，计算确实是一个限制因素，最佳地利用这种计算可以产生具有最佳困惑度的模型，即使在使用GPU的情况下，我们仍然受限于拥有的计算量。因此，在训练和下游推理中决定最佳的分配是一个核心问题，但这一点仍然有些令人不满意。我们知道这些模型从这个预训练阶段中学到了很多，但我们实际上只是依赖于困惑度下降的事实，因此各种任务都会变得更好。现在人们真正想知道的是这些模型实际上在做些什么，它们学到了什么，以及它们是如何能够在如此之多的任务上表现如此出色的。\n",
      "艰巨任务第五部分：算法——让我们回溯到之前讨论的关于记忆的问题。在谈话的早期，我们举了一个例子：纽约时报的一篇文章中提到了一个人的名字，然后文章稍后再次提到他。为了解决这类问题，你需要一个既擅长简单任务，比如能够理解语言的语法和结构，又能完成复杂算法任务的模型，比如记住之前的名字，然后根据上下文线索使用它。多年来，这类问题实际上被认为是语言模型面临的高度、高度挑战性的问题。但是，正如我们所看到的，随着GPT模型的困惑度降低，它能够正确回答这些问题。\n",
      "几乎所有时候，自然语言的复杂性有时会使得这些问题更难以研究，因此人们提出了许多合成任务，模拟语言模型展示的一些有趣特性。其中一个有趣的问题是联想记忆问题。在这个任务中，目标是查看上下文中的小于号，并生成在你下一次产生它时出现在最后的符号。所以在这个例子中，我们将生成字母A，它出现在第一个小于号之前。显然，这是原始任务的抽象，但它很好地代表了问题之所以困难的原因。因此，你可能会问，语言模型是如何学习这种任务的，它们是如何能够做得如此出色。\n",
      "在如此多的不同领域，老实说，我实际上并不确定。关于这个主题有很多论文被写出来，但我仍然觉得我没有得到一个明确的结论。我更愿意考虑这个问题的一个版本，那就是研究语言模型是如何做到的。特别是，他们试图构建可以表示相似属性的抽象，只是为了展示语言模型实现某些目标是可能还是不可能的。探索基于注意力模型的性质有很多不同的形式系统，但有一个我特别喜欢，它被称为RASP（Rigorous Abstract Syntax Pages）。RASP是一种形式语言，它允许我们编写简单的确定性代码，这些代码是有保证可以翻译成\n",
      "与本讲座第一部分类似，我们之前探讨了这些模型的概率性质，并抽象掉了Transformer部分。在这一部分，我们将研究Transformer结构，但将模型中的概率或随机部分抽象掉。基本上，我们将构建这些小型的有限状态自动机（finite state automata）样的小机器，来表示Transformer的属性。让我先来介绍一下RASP，它的工作方式是，我们将编写一个非常短的程序，该程序将描述一个注意力层的工作原理。如果您还记得，注意力有三个部分：查询（query）、键（key）和值（value）。这三个部分结合在一起，生成一个输出，然后用它来预测下一个词或进行输入。\n",
      "在我们的WRA可视化中，我们将增加另一层关注。我们将有一个像这个幻灯片上显示的方形。关键点将位于顶部，查询将在左侧，值将在底部。这三个东西将都是简单值的列表，关键点和查询将通过布尔运算相互作用。最后，一旦我们结合了关键点和查询，我们就会用它来遍历值以产生输出。这种方式的工作原理是，我们简单地看到哪些关键点和查询匹配，然后我们在相应的值上求和。这显然是我们在第二部分看到的完整关注过程的简化，但它可以用来构建简单的程序，然后可以转换为Transformer权重。好的，所以这里有一个\n",
      "我们的第一个rasp程序。这个程序的工作方式是，它将要累加\n",
      "每个词在我们句子中之前的词的数量。我们的程序说，匹配每个键，\n",
      "其索引小于查询索引。下面的右边的矩阵显示\n",
      "到处都是匹配的， specifically for 每个行表示一个查询，我们匹配\n",
      "它左边的所有内容，我们得到一个\n",
      "类似于下三角矩阵的东西。 given that 查询键匹配，\n",
      "然后我们传递一个值，这里的值是 one，然后我们遍历\n",
      "那行中所有的灰色方框求和，这导致了\n",
      "右边的输出，由 0、1、2、3、4、5、6、7 组成，\n",
      "每个词在我们示例中之前的词的数量。显然，这是一个相当简单的程序，\n",
      "但有时候还是有点用的\n",
      "构建更复杂的程序，并至少表明变压器的每个元素都能告诉它在文档中的绝对位置。这里有一个为此程序的另一个程序。我们想要做的是，我们想要将我们的输入向右移动一个单词。为此，我们匹配索引的键到索引减一的查询。这导致右下角的矩阵，这是一个副对角线，在每个单词下方。一旦我们有了这个匹配，我们就将原始标记作为值传入，这会将它们全部向右移动。正如输出所示，输出由对每行求和组成，这导致只是选择了每个原始位置相差一个的单词。我们能够表明，通过简单的匹配，\n",
      "查询和键之间的关系导致了\n",
      "一个矩阵，指示了这些之间的关系，\n",
      "然后最后，当我们传入值时，我们能够\n",
      "选择原始输入的一个给定部分，这对我们是有用的，\n",
      "rasp语言允许您将这些注意力操作与逻辑结合起来，\n",
      "例如，在这个匹配中，我们试图匹配以前具有\n",
      "与当前标记相同的标记值的符号，\n",
      "您可以看到，唯一匹配的是前面\n",
      "在本句开头使用的大于运算符\n",
      "注意力作为一种方式，找到我们以前可能使用过的不同标记，\n",
      "以防我们想要使用它们的附近值来填入下一个词，\n",
      "使用这三个基本运算符，我们可以\n",
      "已经开始构建有趣的程序，所以这个Ras程序由两层注意力组成，第一层在句子中找到大于运算符，第二层将值向后移动一位，提取大于运算符之前的值。运行此代码后，我们能够得到最终输出为大写字母A，该值在大于运算符之前的位置 arbitrarily far in the past。仅通过这两层神经网络的协同作用，我们就可以开始构建相当有趣的程序。以下是同一个程序应用于一个更长的示例，我们能够阅读整个输入并确定Q是在之前的大于符号之前的令牌。这是一个简单的示例，但是通过我们仅用几行代码就可以实现。\n",
      "能够模拟Transformers可能具备的功能，更好地了解这种内部电路可能的样子。您可以上网找到一些非常有趣的rasp程序示例。例如，这里有一个六层模型，能够实现一个完整的加法电路。这个模型可以加任意长度的十进制数字并产生正确的答案。我特别感兴趣的是Transformers可能具备的能力。人们还探索了对大型语言模型可以执行的一些攻击。这个特定的例子非常酷。他们能够从上一张幻灯片中提取加法电路，并展示他们可以向该电路添加一个后门。这是一个\n",
      "相对复杂的WRA程序，但他们能够展示，对于特定的输入，他们可以使模型不增加，而是输出一篇平均的消息。我觉得这一部分要附带一个很大的免责声明，虽然RASP真的很令人兴奋，我们能够构建有趣的程序，甚至将它们编译成真正的变压器，但我们实际上离将现实的网络恢复成RASP代码还非常远。实际上，变压器可能会学习这些电路的非常不同或甚至复杂或随机的版本，我们可能无法将它们隔离或从系统中提取出来。还有可能是，它们学习以对我们来说完全不直观的许多不同方式来执行这些操作，但这话虽如此\n",
      "这仍然非常酷，并且我认为人们应该去了解它，所以最后用一个简短的结论。所以我们先从一个疯狂的例子开始，Chad GPT 能够接受一个相当荒谬的问题，产生一个惊人的答案，它通过基本上只是在一个大机器上对一个非常大的语言模型进行很长时间的训练来实现这一点。我们对这个系统的每个部分如何工作有一定的了解，从生成到内存效率扩展，我们开始更好地掌握其内部推理，但在全球范围内，我们对它的了解仍然非常少，甚至对于这些个别部分也是如此。虽然我对我列出的每个五个公式将继续非常重要这一点很有信心，但已经有各种各样的属性开始出现了。\n",
      "人们正在首次探索困惑的第一部分，我们看到了各种将人类反馈整合到语言模型中的工作。这是Chang的目标和目标。当我们谈论注意力时，还有各种其他模型正在研究不同的架构或其他考虑长期上下文的方法，其中一些可能更好，而另一些可能只是更快。我们并没有详细讨论GPU，但是当谈论扩展时，有关于新架构或新特性或特定新扩展的各种问题，适用于不同的机器。\n",
      "不可能，如果能制作出可以处理更大规模数据（与人类尺度相当）的模型，那将会非常惊人。我之前稍微提到了Rasp语言，并尝试理解某些算法如何用Transformers编写，但是有一个巨大的领域关注Transformers的工作原理及其电路，以及围绕大型语言模型可解释性的各种观点。所有这些都是巨大的研究兴趣领域，你可以探索其中的任何一个，接下来的许多年里都有充足的时间。然后还有一个完全不同的问题，即实际上这些是否有意义。我们拥有这项令人惊叹的技术，它似乎就是能工作，似乎懂得语言，似乎知道如何以各种令人惊讶的方式进行推理。我认为\n"
     ]
    }
   ],
   "source": [
    "for i in range(len(lines) // 20):\n",
    "    data = {\n",
    "        \"model\": \"glm-3-turbo\",\n",
    "        \"messages\": [{\"role\": \"user\", \"content\": '将下面的内容翻译为中文，保留原始文本的含义：' + ''.join(lines[i*20:(i+1)*20])}]\n",
    "    }\n",
    "    \n",
    "    response = requests.post(url, headers=headers, json=data)\n",
    "    print(response.json()['choices'][0]['message']['content'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "899d489b-c66e-4253-aaf1-44997123d812",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"not possible it would be really amazing\\nto produce models that could work with\\nmore human scale amounts of data finally\\nI touched a bit on the rasp language and\\ntrying to understand how certain\\nalgorithms may be coded in Transformers\\nbut there's a massive area that looks at\\nthe circuits of how Transformers work\\nand various ideas surrounding\\ninterpretability of large language\\nmodels all of these are huge areas of\\nresearch interest and you could explore\\nalmost any of them for many many years\\nto come and then there's this whole\\nother question of whether actually any\\nof this matters we have this amazing\\ntechnology and it just seems to work it\\nseems to know language it seems to know\\nhow to do reasoning in all sorts of ways\\nthat are just surprising to us I think\\n\""
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "''.join(lines[i*20:(i+1)*20])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d4092130-0e57-4dbf-a9c4-216cc47233d3",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3.10"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
